题目传送门

寻找道路

题目描述

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

样例输入

3 2
1 2
2 1
1 3

样例输出

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


  分析:

  一道比较考验思维的题目。

  一开始想到用拓扑排序来做,然后直接写了个拓扑来搞,然后发现只用拓扑排序没办法处理一些情况,所以重新转换思路。

  我们可以建一个反向图,然后在这个反向图上以终点为起点跑拓扑排序,处理出合法的点,然后再在原图的合法点上跑最短路。虽然实现起来不难,不过还是有一定思维性的。

  Code:

//It is made by HolseLee on 26th Sep 2018
//Noip2014 D2T2
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std; const int N=1e4+, M=2e5+;
int n,m,dg[N],head[N],cnte,h[N],ce;
int dis[N],tag[N],sta,ed;
bool vis[N];
struct Edge {
int to,nxt;
Edge() {}
Edge(const int &_x,const int &_y): to(_x),nxt(_y) {}
}e[M],edge[M];
struct Cmp {
bool operator ()(int a,int b) {
return dis[a]>dis[b];
}
};
queue<int>team;
priority_queue<int,vector<int>,Cmp>t; inline int read()
{
char ch=getchar(); int num=; bool flag=false;
while( ch<'' || ch>'' ) {
if( ch=='-' ) flag=true; ch=getchar();
}
while( ch>='' && ch<='' ) {
num=num*+ch-''; ch=getchar();
}
return flag ? -num : num;
} inline void add(int x,int y)
{
e[++cnte]=Edge(y,head[x]);
head[x]=cnte;
edge[++ce]=Edge(x,h[y]);
h[y]=ce;
} void bfs()
{
int x,y; team.push(ed); vis[ed]=;
while( !team.empty() ) {
x=team.front(); team.pop();
for(int i=h[x]; i; i=edge[i].nxt) {
y=edge[i].to; tag[y]++;
if( !vis[y] ) {
vis[y]=; team.push(y);
}
}
}
} void dij()
{
memset(vis,,sizeof(vis));
memset(dis,0x3f,sizeof(dis));
dis[sta]=, t.push(sta);
int x,y;
while( !t.empty() ) {
x=t.top(); t.pop();
if( vis[x] ) continue;
vis[x]=;
for(int i=head[x]; i; i=e[i].nxt) {
y=e[i].to;
if( dis[y]>dis[x]+ && tag[y]==dg[y] ) {
dis[y]=dis[x]+; t.push(y);
}
}
}
if( dis[ed]==0x3f3f3f3f ) printf("-1\n");
else printf("%d\n",dis[ed]);
} int main()
{
n=read(); m=read();
int x,y;
for(int i=; i<=m; ++i) {
x=read(), y=read();
if( x==y ) continue;
add(x,y); dg[x]++;
}
sta=read(), ed=read();
bfs(); dij();
return ;
}

洛谷P2296 寻找道路 [拓扑排序,最短路]的更多相关文章

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

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

  2. 洛谷——P2296 寻找道路

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

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

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

  4. NOIP2014 day2 T2 洛谷P2296 寻找道路

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

  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. Bootsrap 直接使用

    Bootstrap3 直接使用 <!DOCTYPE html> <html> <head> <title>Bootstrap3</title> ...

  2. net-speeder

    有的同学反映自己的搬瓦工速度慢,丢包率高.这其实和你的网络服务提供商有关.据我所知一部分上海电信的同学就有这种问题.那么碰到了坑爹的网络服务商,我们应该怎么办呢? duangduang~~~~~~有请 ...

  3. 母版页 VS shtml—ASP.NET细枝末节(3)

    这算是html的重用吧? 网页很多地方长得一样,也有不一样的地方. 把网页中一样的地方,提取出来,形成一个文档. 在其他网页中引用,是网站开发的一个传统的思维. 当然不同的技术有不同的表现形式. 例如 ...

  4. 用java代码调用shell脚本执行sqoop将hive表中数据导出到mysql

    1:创建shell脚本 touch sqoop_options.sh chmod 777 sqoop_options.sh 编辑文件  特地将执行map的个数设置为变量  测试 可以java代码传参数 ...

  5. 论文里有公式?用texlive+texstudio(windows下)

    要写论文了,但论文里有一大堆公式,感觉很麻烦,经过询问同学知道有tex这么个东西,可以像写代码一样写论文,许多论文的格式都有相关的模板,所以学习一下,这里记录一下环境安装. texlive和texst ...

  6. 大数加法(SDUT“斐波那契”串)4335

    题目链接:https://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Contest/contestproblem/cid/2697/pid/4335.ht ...

  7. php中的转义函数

    <?php parse_url 解析URL, 返回各组成部分 urlencode/urldecode url编码/解码 htmlentities 将字符串转化为html实体 htmlentiti ...

  8. 判断Selenium加载完成

    How do you make Selenium 2.0 wait for the page to load? You can also check pageloaded using followin ...

  9. HTTP 请求 的方法Util

    HTTP请求 的一系列方法总结 /** * *******************************传统请求--开始************************************** ...

  10. Linux阵列 RAID详解 (转)

    原文链接:http://molinux.blog.51cto.com/2536040/516008   一. RAID详解   二. mdadm工具介绍   三. 创建一个RAID的基本过程   四. ...