luogu2296 寻找道路

网友投稿 578 2022-10-22

luogu2296 寻找道路

luogu2296 寻找道路

​​ 题目描述 在有向图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: 复制

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。

一道签到题然而我却花了40min给写挂了 还是没想清楚就去搞代码 我太弱了啊

zhx大佬再一次想到正解 去建反图 所以思路就是我们先建一波反图 然后bfs一波 找到那些最后也没有访问到的点 然后用这些点去更新周围的点 因为周围的点都可以到他所以 都打上不可走的标记 最后再从t bfs一波找到s即可

#include#define N 11000#define M 220000#define inf 0x7f7f7f7f#include#includeusing namespace std;inline char gc(){ static char now[1<<16],*S,*T; if(S==T){T=(S=now)+fread(now,1,1<<16,stdin);if (T==S) return EOF; } return *S++;}inline int read(){ int x=0;char ch=gc(); while (ch<'0'||ch>'9') ch=gc(); while (ch<='9'&&ch>='0'){x=x*10+ch-'0';ch=gc();} return x;}bool flag[N],f[N];int f1[N],h[N],in[N],out[N],n,m,num,s,t;struct node{ int y,next,z;}data[M];void bfs(int u){ queue q;q.push(u);memset(f1,0x7f,sizeof(f1));f1[u]=0; while (!q.empty()){ int x=q.front();f[x]=true;q.pop(); for (int i=h[x];i;i=data[i].next){ int y=data[i].y; if (!f[y]&&flag[y]){ if (f1[x]+1

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:hyperf 框架多 env 配置文件支持
下一篇:基于mybatis plus实现数据源动态添加、删除、切换,自定义数据源的示例代码
相关文章

 发表评论

暂时没有评论,来抢沙发吧~