描述

在有向图 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. JSP学习 —— 开篇:JSP,servlet容器,Tomcat,servlet容器之间的关系

    JSP(JAVA SERVER PAGE)的缩写,其本身就是servlet的简化,是一种动态网页标准,其特点是在HTML代码中嵌入JAVA代码,JSP标签或用户标签来生成网页.至于它为什么会出现,主要 ...

  2. 【COGS1672】【SPOJ375】QTREE

    这是我的第一个边权链剖 COGS上和SPOJ有点不一样就是没有多组数据了本质还是一样的 我写的是COGS那个事实上改一改就能够去SPOJ AC了= -= (但是我如今上不去SPOJ卧槽(╯‵□′)╯︵ ...

  3. android图片文件的路径地址与Uri的相互转换

    一个android文件的Uri地址一般如下: content://media/external/images/media/62026 这是一张图片的Uri,那么我们如何根据这个Uri获得其在文件系统中 ...

  4. springmvc+shiro+freemarker实现的安全及权限管理

    本文讲述了基于springmvc+shiro实现安全管理,shiro+freemarker实现权限验证. 首先我们从web.xml开始: <?xml version="1.0" ...

  5. 很安逸的离线API文档查询工具Dash和Zeal

    大家开发的时候难免会查询一些文档,看一下API的调用方法等,所以会不同的语言去某一个地方去找,确实很麻烦,今天给大家安逸两款软件,肯定会让你爱不释手! Dash for macOS 官方地址:http ...

  6. 51NOD——N 1107 斜率小于0的连线数量

    https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1107 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 ...

  7. [RxJS] Stopping a shared observable execution

    ConnectableObservable has the connect() method to conveniently dictate the start of the shared execu ...

  8. ORACLE RMAN备份及还原 RMAN能够进行增量备份:数据库,表空间,数据文件

    ORACLE RMAN备份及还原   RMAN能够进行增量备份:数据库.表空间.数据文件 仅仅有使用过的block能够被备份成backup set 表空间与数据文件相应关系:dba_data_file ...

  9. WCF REST 基础教程

    概述 Representational State Transfer(REST)是Roy Fielding博士在2000年他的博士论文中提出来的一种软件架构风格. 因此REST是设计风格而不是标准,R ...

  10. ZOJ 1101 Gamblers 二分

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=101 让你在一堆互不相同的数中查找是否有a=b+c+d,若有不同的解,则输出最大 ...