问题描述

在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件:

1 .路径上的所有点的出边所指向的点都直接或间接与终点连通。

2 .在满足条件1 的情况下使路径最短。

注意:图G 中可能存在重边和自环,题目保证终点没有出边。

请你输出符合条件的路径的长度。

输入格式

第一行有两个用一个空格隔开的整数n 和m ,表示图有n 个点和m 条边。

接下来的m 行每行2 个整数x 、y ,之间用一个空格隔开,表示有一条边从点x 指向点y 。

最后一行有两个用一个空格隔开的整数s 、t ,表示起点为s ,终点为t 。

输出格式

输出只有一行,包含一个整数,表示满足题目描述的最短路径的长度。如果这样的路径不存在,输出- 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

说明

解释1:

如上图所示,箭头表示有向道路,圆点表示城市。起点1 与终点3 不连通,所以满足题

目᧿述的路径不存在,故输出- 1 。

解释2:

如上图所示,满足条件的路径为1 - >3- >4- >5。注意点2 不能在答案路径中,因为点2连了一条边到点6 ,而点6 不与终点5 连通。

对于30%的数据,0<n≤10,0<m≤20;

对于60%的数据,0<n≤100,0<m≤2000;

对于100%的数据,0<n≤10,000,0<m≤200,000,0<x,y,s,t≤n,x≠t。

解析

  • 首先建反图,找到能够到达终点的点。
  • 然后在原图上确认哪些点是不满足条件的。
  • 然后BFS,不经过不满足条件的点,得到答案。

代码

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <queue>
  4. #include <cstring>
  5. #define N 10002
  6. #define M 200002
  7. using namespace std;
  8. struct edge{
  9. int u,v;
  10. }e[M];
  11. struct node{
  12. int x,d;
  13. node(int _x,int _d){
  14. x=_x,d=_d;
  15. }
  16. };
  17. int head[N],ver[M],nxt[M],l;
  18. int n,m,s,t,i,j;
  19. bool f[N],vis[N];
  20. int read()
  21. {
  22. char c=getchar();
  23. int w=0;
  24. while(c<'0'||c>'9') c=getchar();
  25. while(c<='9'&&c>='0'){
  26. w=w*10+c-'0';
  27. c=getchar();
  28. }
  29. return w;
  30. }
  31. void insert(int x,int y)
  32. {
  33. l++;
  34. ver[l]=y;
  35. nxt[l]=head[x];
  36. head[x]=l;
  37. }
  38. void bfs1()
  39. {
  40. queue<int> q;
  41. q.push(t);
  42. f[t]=1;
  43. while(!q.empty()){
  44. int x=q.front();
  45. q.pop();
  46. for(int i=head[x];i;i=nxt[i]){
  47. int y=ver[i];
  48. if(!f[y]){
  49. f[y]=1;
  50. q.push(y);
  51. }
  52. }
  53. }
  54. }
  55. int bfs2()
  56. {
  57. queue<node> q;
  58. q.push(node(s,0));
  59. memset(f,0,sizeof(f));
  60. f[s]=1;
  61. while(!q.empty()){
  62. int x=q.front().x,d=q.front().d;
  63. q.pop();
  64. for(int i=head[x];i;i=nxt[i]){
  65. int y=ver[i];
  66. if(!f[y]&&vis[y]){
  67. f[y]=1;
  68. if(y==t) return d+1;
  69. q.push(node(y,d+1));
  70. }
  71. }
  72. }
  73. return -1;
  74. }
  75. int main()
  76. {
  77. n=read();m=read();
  78. for(i=1;i<=m;i++){
  79. e[i].u=read(),e[i].v=read();
  80. insert(e[i].v,e[i].u);
  81. }
  82. s=read();t=read();
  83. bfs1();
  84. memset(head,0,sizeof(head));
  85. memset(vis,1,sizeof(vis));
  86. l=0;
  87. for(i=1;i<=m;i++) insert(e[i].u,e[i].v);
  88. for(i=1;i<=n;i++){
  89. for(j=head[i];j;j=nxt[j]){
  90. if(!f[ver[j]]) vis[i]=0;
  91. }
  92. }
  93. cout<<bfs2()<<endl;
  94. return 0;
  95. }

[洛谷P2296] NOIP2014 寻找道路的更多相关文章

  1. 【题解】洛谷P2296 [NOIP2014TG] 寻找道路(SPFA+DFS)

    题目来源:洛谷P2296 思路 一开始看还以为是一道水题 虽然本来就挺水的 本道题的难点在于如何判断是否路径上的点都会直接或者间接连着终点 我们需要在一开始多建一个反向图 然后从终点DFS回去 把路径 ...

  2. 【洛谷P2296】寻找道路

    反正图两边bfs #include<iostream> #include<cstdio> #include<queue> using namespace std; ...

  3. 洛谷 P2296 【寻找道路】

    这道题真的很女少啊 言归正传: 这道题其实就是考验的思路,读题后,我们发现对于某个点他所连接的点必须连接终点,那么我们直接反向存图,从终点进行bfs,可以找到未连接的点,然后对这些点所连接的点进行标记 ...

  4. 【DFS】【最短路】【spfa】【BFS】洛谷P2296 NOIP2014提高组 day2 T2 寻找道路

    存反图,从终点dfs一遍,记录下无法到达的点. 然后枚举这些记录的点,把他们的出边所连的点也全部记录. 以上这些点都是无法在最短路中出现的. 所以把两个端点都没被记录的边加进图里,跑spfa.BFS什 ...

  5. 洛谷 题解 P2296 【寻找道路】

    Problem P2296 [寻找道路] solution 首先声明,这题我用了spfa,而: 关于spfa:它死了. 杀手: NOI 2018−T1 出题人 感谢出题人,没有卡spfa 用时: 20 ...

  6. 【DFS】【图论】NOIP2014寻找道路

    [NOIP2014]寻找道路 题目描述 Description 在有向图G中,每条边的长度均为1,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1.路径上的所有点的出边所 ...

  7. DP【洛谷P1704】 寻找最优美做题曲线

    [洛谷P1704] 寻找最优美做题曲线 题目背景 nodgd是一个喜欢写程序的同学,前不久(好像还是有点久了)洛谷OJ横空出世,nodgd同学当然第一时间来到洛谷OJ刷题.于是发生了一系列有趣的事情, ...

  8. 洛谷P1462 通往奥格瑞玛的道路(二分+spfa,二分+Dijkstra)

    洛谷P1462 通往奥格瑞玛的道路 二分费用. 用血量花费建图,用单源最短路判断 \(1\) 到 \(n\) 的最短路花费是否小于 \(b\) .二分时需要不断记录合法的 \(mid\) 值. 这里建 ...

  9. 洛谷P1462-通往奥格瑞玛的道路-二分+最短路

    洛谷P1462-通往奥格瑞玛的道路 题目描述 在艾泽拉斯,有\(n\)个城市.编号为\(1,2,3,...,n\). 城市之间有\(m\)条双向的公路,连接着两个城市,从某个城市到另一个城市,会遭到联 ...

随机推荐

  1. PCIE手札

    PCIE兼容了大部分PCI总线的特性,区别在于使用串行差分总线代替了并行总线,并实现了协议分层.PCIE的带宽与LANE数量和时钟频率相关,时钟频率支持2.5G和5G,Lane支持x1/x2/x4/x ...

  2. MySQL5.6transportable tablespace

    https://blog.csdn.net/xiaoyi23000/article/details/53150776

  3. So the type system doesn’t feel so static.

    object wb{ def main(args:Array[String]){ println("Happy everyday!DATA-CENTER!") println(ne ...

  4. vue-element-template模板项目使用记录(持续更新)

    1. npm 使用注意事项: a. node.js 使用 v8.16.0 版本,使用 v10 版本会有各种莫名其妙的报错 b. 开箱先改淘宝镜像: npm config set registry ht ...

  5. 【服务器】一次对Close_Wait 状态故障的排查经历

    最近接连听说一台线上服务器总是不响应客户端请求. 登录服务器后查询iis状态,发现应用程序池状态变为已停止. 按经验想,重启后应该就ok,第一次遇到也确实起了作用,当时完全没在意,以为是其他人无意把服 ...

  6. 阶段1 语言基础+高级_1-3-Java语言高级_04-集合_02 泛型_2_使用泛型的好处

    用一个案例说明使用泛型和不是用泛型的区别 这里的ArrayList没写数据类型,不写就是默认Object 多态的弊端,不能使用子类特有的方法 向下转型,转换为String类型,才能使用length 不 ...

  7. 阶段1 语言基础+高级_1-3-Java语言高级_04-集合_06 Set集合_5_HashSet存储自定义类型元素

    想存储的元素不重复,就必须重写hashCode和equals这两个方法 新建一个Person类.添加姓名和年龄这两个成员变量..get和set,有参和无参构造. 重点是重写了toString的方法 自 ...

  8. 发邮件--yagmail模块

    准备工作:1.在你的邮箱设置里面打开smtp服务(若有的话)2.开启邮箱授权码,记住这个授权码(连接邮箱服务时用) 1.安装yagmail模块pip install yagmail2.举例:impor ...

  9. 函数介绍——MulDiv

    http://blog.sina.com.cn/s/blog_579ebc11010008ql.html 函数介绍——MulDiv (2007-03-27 10:05:30) 转载▼   分类: 编程 ...

  10. 【Unity Shader】---Alpha Blending的意义

    Alpha Blending 即Alpha混合 Blending 就是处理透明度的,处理光栅化最后阶段,显示在屏幕上的颜色 1 Blend Off 关闭alpha混合 2 混合公式:Blend Src ...