题目描述

在有向图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:

  1. 3 2
  2. 1 2
  3. 2 1
  4. 1 3
输出样例#1:

  1. -1
输入样例#2:

  1. 6 6
  2. 1 2
  3. 1 3
  4. 2 6
  5. 2 5
  6. 4 5
  7. 3 4
  8. 1 5
输出样例#2:

  1. 3

如上图所示,箭头表示有向道路,圆点表示城市。起点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一遍,标记所有走过的点。

如果倒着BFS不能到起点,说明不连通。

如果能到起点,则正向BFS,SPFA求单源最短路径,途中要判断所经历的点都在答案路径内(即该点所有出边都指向之前标记过的点)

妥了

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cmath>
  4. #include<cstring>
  5. using namespace std;
  6. //
  7. int head[];
  8. int ct=,s,t;
  9. int used[],dis[];
  10. int n,m,x[],y[];
  11. //
  12. //邻接表处理
  13. struct edge{
  14. int next;
  15. int to;
  16. }e[];
  17. void add(int from,int to){
  18. e[++ct].to=to;
  19. e[ct].next=head[from];
  20. head[from]=ct;
  21. return;
  22. }
  23. bool pd(int pos){
  24. int i;
  25. for(i=head[pos];i;i=e[i].next){
  26. if(!used[e[i].to])return ;//未与终点联通
  27. }
  28. return ;
  29. }
  30. //
  31. int q[];
  32. int main(){
  33. scanf("%d%d",&n,&m);
  34. int i,j;
  35. for(i=;i<=m;i++){
  36. scanf("%d%d",&x[i],&y[i]);
  37. add(y[i],x[i]);//第一遍反向制表
  38. }
  39. scanf("%d%d",&s,&t);
  40. //bfs
  41. int hd=,tl=;
  42. q[]=t;
  43. used[t]=;
  44. while(hd<=tl){
  45. int pos=q[hd];
  46. hd++;
  47. for(i=head[pos];i;i=e[i].next){
  48. if(!used[e[i].to]){
  49. q[++tl]=e[i].to;
  50. used[e[i].to]=;
  51. }
  52. }
  53. }
  54. //finish
  55. if(!used[s]){
  56. printf("-1");
  57. return ;
  58. }
  59. memset(head,,sizeof(head));//再次初始化
  60. memset(q,,sizeof(q));
  61. memset(dis,-,sizeof(dis));
  62. ct=;
  63. for(i=;i<=m;i++){
  64. add(x[i],y[i]);
  65. }
  66. //bfs
  67. q[]=s;
  68. dis[s]=;
  69. hd=;tl=;
  70. int ans=;
  71. while(hd<=tl){//开始正向SPFA
  72. int pos=q[hd];
  73. hd++;
  74. if(pd(pos)==)continue;
  75. for(i=head[pos];i;i=e[i].next){
  76. if(dis[e[i].to] ==-)
  77. {
  78. dis[e[i].to]=dis[pos]+;
  79. q[tl++]=e[i].to;
  80. if(e[i].to==t){
  81. ans=dis[t];
  82. printf("%d",ans);//找到解输出
  83. return ;
  84. }
  85. }
  86. }
  87. }
  88. //finish
  89. printf("-1");
  90. return ;
  91. }

NOIP2014 day2 T2 洛谷P2296 寻找道路的更多相关文章

  1. [NOIP2014] 提高组 洛谷P2296 寻找道路

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

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

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

  3. 洛谷——P2296 寻找道路

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

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

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

  5. 洛谷 [P2296] 寻找道路

    反向BFS预处理,求出所有符合题意的点,再正向BFS,(注意对于边权恒为一的点,BFS,比SPFA高效) 输入时n与m分清 #include <iostream> #include < ...

  6. 洛谷 P2296 寻找道路 —— bfs

    题目:https://www.luogu.org/problemnew/show/P2296 第一次用 Emacs 对拍,写了半天: 注意那个 is 赋值的地方很容易错,千万别反复赋值: 一道水题写了 ...

  7. 洛谷P2296寻找道路

    传送门啦 题目中有一个条件是路径上的所有点的出边所指向的点都直接或间接与终点连通. 所以我们要先判断能否走这一个点, $ bfs $ 类似 $ spfa $ 的一个判断,打上标记. 在这我反向建图,最 ...

  8. 洛谷 P2296 寻找道路【bfs+spfa】

    反向建边bfs出不能到t的点,然后对每个能到这些点的点打上del标记,然后spfa的时候不经过这些点即可 #include<iostream> #include<cstdio> ...

  9. 洛谷P2296 寻找道路_简单BFS

    Code: #include<cstdio> #include<queue> #include<algorithm> using namespace std; co ...

随机推荐

  1. IO流的练习5 —— 读取文件中的字符串,排序后写入另一文件中

    需求:已知s.txt文件中有这样的一个字符串:“hcexfgijkamdnoqrzstuvwybpl” 请编写程序读取数据内容,把数据排序后写入ss.txt中. 分析: A:读取文件中的数据 B:把数 ...

  2. [5]Telerik Extensions for ASP.NET MVC 开发问题

    1.Controller获取不到checkedNodes的问题 HTML @(Html.Telerik().TreeView()        .Name("TreeView")  ...

  3. 爱奇艺招聘uwp开发

    招聘链接:https://job.cnblogs.com/offer/53380/ 工作地点:北京-海淀 工作年限:1年 学历要求:本科 招聘分类:移动开发工程师 工资范围:面议 职位要求 1.扎实的 ...

  4. Ubuntu优化-py用机器

    关闭防火墙 ufw disable pip换源 yum install python-pip -y mkdir ~/.pip cat > pip.conf<<a [global] i ...

  5. PPPOE原理及部署

    PPPOE 1,一个广播域 2,panabit可以做小区项目 http://edu.51cto.com/course/course_id-3849.html   Adsl的介绍 所谓非对称,即上下行速 ...

  6. (OAF)jdeveloper集成log4j并将日志输出到指定文件并写入数据库

    参考: How to configure Log4j in JDev 11g Ever wanted to use log4j in your adf project ? Well though Or ...

  7. JS案例之6——瀑布流布局(1)

    在实际的项目中,偶尔会用到一种布局——瀑布流布局.瀑布流布局的特点是,在多列布局时,可以保证内容区块在水平方向上不产生大的空隙,类似瀑布的效果.简单的说,在垂直列表里,内容区块是一个挨着一个的.当内容 ...

  8. 信息安全系统设计基础exp_1

    详见搭档20135322郑伟博客链接:http://www.cnblogs.com/zhengwei0712/

  9. Jenkins进阶系列之——15Maven获取Jenkins的Subversion的版本号

    各位小伙伴们在工作中总是会碰到各种各样的奇葩需求,今天给大家说说Maven怎么在Jenkins中获取Subversion的版本号. Jenkins自己的环境变量中包含了很多有用的的参数,详情查看:ht ...

  10. 1.SQLAlchemy文档-简介(中文版)

    Python的SQL工具包和对象关系映射器     SQLAlchemy的是Python的SQL工具包和对象关系映射器,让应用程序开发人员可以使用上SQL的强大功能和灵活性.     它提供了一套完整 ...