洛谷 P2296 寻找道路
2017-07-25 17:46
316 查看
题目描述
在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件:
1 .路径上的所有点的出边所指向的点都直接或间接与终点连通。
2 .在满足条件1 的情况下使路径最短。
注意:图G 中可能存在重边和自环,题目保证终点没有出边。
请你输出符合条件的路径的长度。
输入输出格式
输入格式:
输入文件名为road .in。
第一行有两个用一个空格隔开的整数n 和m ,表示图有n 个点和m 条边。
接下来的m 行每行2 个整数x 、y ,之间用一个空格隔开,表示有一条边从点x 指向点y 。
最后一行有两个用一个空格隔开的整数s 、t ,表示起点为s ,终点为t 。
输出格式:
输出文件名为road .out 。
输出只有一行,包含一个整数,表示满足题目᧿述的最短路径的长度。如果这样的路径不存在,输出- 1 。
输入输出样例
输入样例#1:
3 2
1 2
2 1
1 3
输出样例#1:
-1
输入样例#2:
6 6
1 2
1 3
2 6
2 5
4 5
3 4
1 5
输出样例#2:
3
做法:一开始看着似乎挺水(其实就是水)的,然后因为一些奇怪的错误没写出来,做法很多,我选了个简便的,反着跑一边spfa正着跑一边就好了
代码如下:
在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件:
1 .路径上的所有点的出边所指向的点都直接或间接与终点连通。
2 .在满足条件1 的情况下使路径最短。
注意:图G 中可能存在重边和自环,题目保证终点没有出边。
请你输出符合条件的路径的长度。
输入输出格式
输入格式:
输入文件名为road .in。
第一行有两个用一个空格隔开的整数n 和m ,表示图有n 个点和m 条边。
接下来的m 行每行2 个整数x 、y ,之间用一个空格隔开,表示有一条边从点x 指向点y 。
最后一行有两个用一个空格隔开的整数s 、t ,表示起点为s ,终点为t 。
输出格式:
输出文件名为road .out 。
输出只有一行,包含一个整数,表示满足题目᧿述的最短路径的长度。如果这样的路径不存在,输出- 1 。
输入输出样例
输入样例#1:
3 2
1 2
2 1
1 3
输出样例#1:
-1
输入样例#2:
6 6
1 2
1 3
2 6
2 5
4 5
3 4
1 5
输出样例#2:
3
做法:一开始看着似乎挺水(其实就是水)的,然后因为一些奇怪的错误没写出来,做法很多,我选了个简便的,反着跑一边spfa正着跑一边就好了
代码如下:
#include <cstdio> #include <cstring> #include <iostream> using namespace std; struct arr { int to,next; }f[200007],ff[200007]; int ls[200007],d[10007],list[400007],s,t,n,m,lsl[200007]; bool v[10007],b[10007]; void spfa2(int x) { for (int i=1;i<=n;i++) d[i]=20000000; d[x]=0; b[x]=1; int head=0,tail=1; list[1]=x; int g; while (head<tail) { head++; g=lsl[list[head]]; while (g!=0) { if (d[list[head]]+1<d[ff[g].to]) { d[ff[g].to]=d[list[head]]+1; if (!b[ff[g].to]) { b[ff[g].to]=1; tail++; list[tail]=ff[g].to; } } g=ff[g].next; } b[list[head]]=0; } } void spfa(int x) { for (int i=1;i<=n;i++) d[i]=20000000; d[x]=0; b[x]=1; int head=0,tail=1; list[1]=x; int g; while (head<tail) { head++; g=ls[list[head]]; while (g!=0) { if (d[list[head]]+1<d[f[g].to] && !v[f[g].to]) { d[f[g].to]=d[list[head]]+1; if (!b[f[g].to]) { b[f[g].to]=1; tail++; list[tail]=f[g].to; } } g=f[g].next; } b[list[head]]=0; } } int main() { scanf("%d%d",&n,&m); int q,p; for (int i=1;i<=m;i++) { scanf("%d%d",&q,&p); f[i].to=p; f[i].next=ls[q]; ls[q]=i; ff[i].to=q; ff[i].next=lsl[p]; lsl[p]=i; } scanf("%d%d",&s,&t); spfa2(t); for (int i=1;i<=n;i++) if (d[i]==20000000) { int p=lsl[i]; while (p>0) { v[ff[p].to]=1; p=ff[p].next; } } spfa(s); if (d[t]==20000000) cout<<-1; else printf("%d",d[t]); }
相关文章推荐
- 洛谷 P2296 寻找道路
- 洛谷 P2296 [NOIP2014 D2T2] 寻找道路
- 洛谷——P2296 寻找道路
- 洛谷 P2296 寻找道路【bfs+spfa】
- 洛谷 P2296 寻找道路
- 洛谷 [P2296] 寻找道路
- |洛谷|搜索|NOIP2014|P2296 寻找道路
- AC日记——寻找道路 洛谷 P2296
- 洛谷 P2296 寻找道路
- P2296 寻找道路
- 洛谷2296 寻找道路
- P2296 寻找道路
- 洛谷2296 寻找道路
- P2296 寻找道路
- 洛谷2296 寻找道路
- (洛谷 2296)寻找道路
- 【洛谷 2296】寻找道路
- 1807. [NOIP2014]寻找道路P2296 寻找道路
- 寻找道路(洛谷 2296)
- P2296 寻找道路