【NOIP2014提高组】寻找道路
2024-10-10 17:06:16
https://www.luogu.org/problem/show?pid=2296
满足条件的路径:路径上的所有点的出边所指向的点都与终点连通。
反过来,不满足条件的路径:路径上至少一点的出边所指向的点不与终点连通。
考虑把所有与终点不连通的点以及指向他们的点都删掉,再一遍BFS求出最短路径。
具体做法:
对原图的转置图(将所有边的方向翻转得到的图)从终点开始一遍搜索,把传达不到的爱恋点以及在转置图中它们的所有出点全部标记。注意用两种不同的标记,否则会混乱。
最后在原图跑一遍BFS求出最短路径,有标记的点都不管。
#include <iostream>
#include <vector>
#include <queue>
#define maxn 10005
using namespace std;
int n, m, s, t;
vector<int> g[maxn], gt[maxn];
bool visited[maxn];
int dist[maxn];
int mark[maxn]; // 0/1表示该点与终点不连通/联通,-1表示该点指向标记0的点
void dfs(int k)
{
mark[k] = ;
for (int i = ; i < gt[k].size(); i++)
{
if (!visited[gt[k][i]])
{
visited[gt[k][i]] = true;
dfs(gt[k][i]);
}
}
}
void bfs()
{
queue<int> q;
q.push(s);
while (!q.empty() && dist[t] == )
{
int k = q.front();
q.pop();
if (mark[k] == )
{
for (int i = ; i < g[k].size(); i++)
{
if (!dist[g[k][i]])
{
dist[g[k][i]] = dist[k] + ;
q.push(g[k][i]);
}
}
}
}
}
int main()
{
cin >> n >> m;
int a, b;
for (int i = ; i <= m; i++)
{
cin >> a >> b;
if (a != b)
{
g[a].push_back(b);
gt[b].push_back(a);
}
}
cin >> s >> t;
dfs(t);
for (int i = ; i <= n; i++)
{
if (mark[i] == )
{
for (int j = ; j < gt[i].size(); j++)
{
mark[gt[i][j]] = -;
}
}
}
bfs();
cout << (dist[t] > ? dist[t] : -) << endl;
return ;
}
最新文章
- (原创)解决.net 下使用uploadify,在火狐浏览器下的error 302
- python获取父类的子类(遍历,递归),并循环执行所有子类的某一方法
- python字典
- iframe自适应高度,根据src中页面来得到。
- [DBW]js获取当前时间(昨天、今天、明天)
- PDA手持移动POS销售开单软件(网络版)、PDA手持设备小票机
- jQuery 源码理解的基础
- Octopus系列之如何让前台的js脚本变得灵活重用
- 使用Dnsmasq搭建本地dns服务器上网
- 【Tsinsen】【A1365】森林旅店
- Oracle VM Virtual Box 4.3 小巧精悍的虚拟机软件
- 面向对象 ---Java抽象类
- Arcgis API for Android之GPS定位
- 游戏开发实验室的内部讲座总结----c++
- Python异常处理体系
- 动态添加删除网卡 - 每天5分钟玩转 OpenStack(156)
- mysql分页查询优化
- Linux下部署tomcat
- Linux常见命令(三)
- ArcGis 属性表.dbf文件使用Excel打开中文乱码的解决方法