描述

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

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

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

注意:图 G 中可能存在重边和自环,题目保证终点没有出边。 请你输出符合条件的路径的长度。

格式

输入格式

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

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

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

输出格式

输出只有一行,包含一个整数,表示满足题目描述的最短路径的长度。

如果这样的路径不存在,输出-1。

样例1

样例输入1[复制]

3 2

1 2

2 1

1 3

样例输出1[复制]

-1

样例2

样例输入2[复制]

6 6

1 2

1 3

2 6

2 5

4 5

3 4

1 5

样例输出2[复制]

3

限制

对于 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。

【题解】



把所有的边反向一下;

然后从终点进行dfs,预处理出哪些点可以到达终点;

然后枚举每一个点;看看是不是它所有的出边都能达到终点。有一个不能到达;这个点最后就不能被加入到最短路径中;

根据得到的信息正向进行spfa即可;

  1. #include <cstdio>
  2. #include <cmath>
  3. #include <set>
  4. #include <map>
  5. #include <iostream>
  6. #include <algorithm>
  7. #include <cstring>
  8. #include <queue>
  9. #include <vector>
  10. #include <stack>
  11. #include <string>
  12. #define lson L,m,rt<<1
  13. #define rson m+1,R,rt<<1|1
  14. #define LL long long
  15. using namespace std;
  16. const int MAXN = 1e4+100;
  17. const int dx[5] = {0,1,-1,0,0};
  18. const int dy[5] = {0,0,0,-1,1};
  19. const int INF = 0x3f3f3f3f;
  20. const double pi = acos(-1.0);
  21. vector <int> zheng[MAXN],fan[MAXN];
  22. int n,m,s,t,dis[MAXN];
  23. bool bo[MAXN],can[MAXN];
  24. queue <int> dl;
  25. bool inque[MAXN];
  26. void input_LL(LL &r)
  27. {
  28. r = 0;
  29. char t = getchar();
  30. while (!isdigit(t)) t = getchar();
  31. LL sign = 1;
  32. if (t == '-')sign = -1;
  33. while (!isdigit(t)) t = getchar();
  34. while (isdigit(t)) r = r * 10 + t - '0', t = getchar();
  35. r = r*sign;
  36. }
  37. void input_int(int &r)
  38. {
  39. r = 0;
  40. char t = getchar();
  41. while (!isdigit(t)) t = getchar();
  42. int sign = 1;
  43. if (t == '-')sign = -1;
  44. while (!isdigit(t)) t = getchar();
  45. while (isdigit(t)) r = r * 10 + t - '0', t = getchar();
  46. r = r*sign;
  47. }
  48. void dfs(int x)
  49. {
  50. bo[x] = true;
  51. int len = fan[x].size();
  52. for (int i = 0;i <= len-1;i++)
  53. {
  54. int y = fan[x][i];
  55. if (!bo[y])
  56. dfs(y);
  57. }
  58. }
  59. int main()
  60. {
  61. input_int(n);input_int(m);
  62. for (int i = 1;i <= m;i++)
  63. {
  64. int x,y;
  65. input_int(x);input_int(y);
  66. zheng[x].push_back(y);
  67. fan[y].push_back(x);
  68. }
  69. input_int(s);input_int(t);
  70. dfs(t);
  71. for (int i = 1;i <= n;i++)
  72. {
  73. int len = zheng[i].size();
  74. can[i] = true;
  75. for (int j = 0;j <= len-1;j++)
  76. {
  77. int y = zheng[i][j];
  78. if (!bo[y])
  79. {
  80. can[i] = false;
  81. break;
  82. }
  83. }
  84. }
  85. memset(dis,INF,sizeof(dis));
  86. dis[s] = 0;
  87. dl.push(s);
  88. inque[s] = true;
  89. while (!dl.empty())
  90. {
  91. int x = dl.front();
  92. dl.pop();
  93. inque[x] = false;
  94. int len = zheng[x].size();
  95. for (int i = 0;i <= len-1;i++)
  96. {
  97. int y = zheng[x][i];
  98. if (can[y] && dis[y]>dis[x]+1)
  99. {
  100. dis[y] = dis[x]+1;
  101. if (!inque[y])
  102. {
  103. inque[y] = true;
  104. dl.push(y);
  105. }
  106. }
  107. }
  108. }
  109. if (dis[t]>=INF)
  110. puts("-1");
  111. else
  112. printf("%d\n",dis[t]);
  113. return 0;
  114. }

【30.00%】【vijos 1909】寻找道路的更多相关文章

  1. NOIP2014 寻找道路

    2.寻找道路 (road.cpp/c/pas) [问题描述] 在有向图G中,每条边的长度均为1,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1.路径上的所有点的出边所指 ...

  2. Codevs 3731 寻找道路 2014年 NOIP全国联赛提高组

    3731 寻找道路 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 在有向图G中,每条边的长度均为1,现给定起点和终点,请你在图中找 ...

  3. 洛谷P2296 寻找道路 [拓扑排序,最短路]

    题目传送门 寻找道路 题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点 ...

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

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

  5. 洛谷P2296 寻找道路==codevs3731 寻找道路

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

  6. noip寻找道路

    题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点连通. 2 .在满足条 ...

  7. 洛谷——P2296 寻找道路

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

  8. NOIP2014 day2 t2 寻找道路

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

  9. 【NOIP14 D2T2】寻找道路

    Source and Judge NOIP2014 提高组 D2T2Luogu2296Caioj1567 Problem [Description] 在有向图 G 中,每条边的长度均为 1,现给定起点 ...

  10. 我的新计划 《2Dof Racing Simulator》2014/3/9 20:30:00

    最近好久都没来网站上了,也没心思和时间去弄VellLock和升级V&View了.一直在蕴量这做一件大玩意. 最近一直都很忙,忙着做数电课设,还有各种实验,可是我的心思不在这些东西上,当然除了数 ...

随机推荐

  1. POJ 2536 Gopher II (ZOJ 2536) 二分图匹配

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1882 http://poj.org/problem?id=2536 题目大 ...

  2. (转)bat批处理的注释语句

    在批处理中,段注释有一种比较常用的方法: goto start = 可以是多行文本,可以是命令 = 可以包含重定向符号和其他特殊字符 = 只要不包含 :start 这一行,就都是注释 :start 另 ...

  3. loadrunner--log的使用总结

    1.log的设置方式.在 runtime setting中可以设置log的生成方式:默认的log方式:Enable logging选中,log option是Send messages only wh ...

  4. iOS开发- iOS7显示偏差(UITableView下移)解决的方法

    之前碰到过一个问题. 就是利用storyboard拖动出来的控件, 在iOS7上跑老是莫名的下移. 比方这样(红色区域为多余的) 解决的方法: iOS7在Conttoller中新增了这个属性: aut ...

  5. 从零开始使用git第三篇:git撤销操作、分支操作和常见冲突

    从零开始使用git 第三篇:git撤销操作.分支操作和常见冲突 第一篇:从零开始使用git第一篇:下载安装配置 第二篇:从零开始使用git第二篇:git实践操作 第三篇:从零开始使用git第三篇:gi ...

  6. ImageView的圆角半径

    // 设置imageview的圆角半径 UIImageView *imageView = (UIImageView *)[cell viewWithTag:tag]; imageView.layer. ...

  7. vue学习笔记三:常见的表单绑定

    <template> <div id="app"> <input type="checkbox" id="checked ...

  8. linux系统进程的查看与控制

    原文:linux系统进程的查看与控制 一.什么是进程? 进程就是系统未完成并且正在进行的工作. 二.查看系统进程 1.图形方式查看 gnome-system-monitor 2.进程查看命令 ps - ...

  9. UI 06 ScrollView 的手动循环播放 与 自己主动循环播放

    假设想要循环播放的话, scrollView的照片前要加上最后一张图片, 最后要加上第一张图片. - (void)viewDidLoad { [super viewDidLoad]; // Do an ...

  10. hadoop集群中的日志文件 分类: A1_HADOOP 2015-02-28 20:37 680人阅读 评论(0) 收藏

    hadoop存在多种日志文件,其中master上的日志文件记录全面信息,包括slave上的jobtracker与datanode也会将错误信息写到master中.而slave中的日志主要记录完成的ta ...