博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷P2296 寻找道路==codevs3731 寻找道路
阅读量:7060 次
发布时间:2019-06-28

本文共 2337 字,大约阅读时间需要 7 分钟。

P2296 寻找道路

题目描述

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

 

AC代码:

 

#include
#include
#include
using namespace std;#define N 200010#define QLEN 100001pair
ed[N];struct node{ int v,next;}e[N<<1];int n,m,cnt,S,T,q[N>>1],head[N>>1],dis[N>>1];bool vis[N];bool pd(int pos){ for(int i=head[pos];i;i=e[i].next) if(!vis[e[i].v]) return 0;//未与终点联通 return 1;}bool spfa(){
//反向走一遍,判断是否有路 q[1]=T; vis[T]=1; int h=0,t=1; while(h
QLEN) h=1; int p=q[h];//不用vis[p]=0; for(int i=head[p];i;i=e[i].next){ int v=e[i].v; if(!vis[v]){ vis[v]=1; if(++t>QLEN) t=1; q[t]=v; } } } return !vis[S];}bool SPFA(){
//正向更新最短路(dis[]不用初始化极大值) q[1]=S; dis[S]=0; int h=0,t=1; while(h
QLEN) h=1; int p=q[h];//不用vis[p]=0; if(!pd(p)) continue; for(int i=head[p];i;i=e[i].next){ int v=e[i].v; if(!dis[v]){ dis[v]=dis[p]+1; if(++t>QLEN) t=1; q[t]=v; if(v==T){printf("%d\n",dis[T]);return 0;}//有解 输出 } } } return 1;}void add(int x,int y){ e[++cnt].v=y; e[cnt].next=head[x]; head[x]=cnt;}int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) scanf("%d%d",&ed[i].first,&ed[i].second),add(ed[i].second,ed[i].first);//第一遍反向制表 scanf("%d%d",&S,&T); if(spfa()){puts("-1");return 0;} memset(head,0,sizeof head);//再次初始化 for(int i=1;i<=m;i++) add(ed[i].first,ed[i].second); if(SPFA()){puts("-1");return 0;} return 0;}

 

 

 

转载于:https://www.cnblogs.com/shenben/p/5635346.html

你可能感兴趣的文章
2016/4/3 总结作业
查看>>
用node.js写一个jenkins发版脚本
查看>>
iOS开发-UITabBarController详解
查看>>
算法-动态连通性
查看>>
webBrowser控件
查看>>
layui 表格组件不能访问连续的属性的解决办法
查看>>
windows server 2003 原版 安装 php+mysql+apache 教程
查看>>
【BZOJ1930】【SHOI2003】吃豆豆
查看>>
PostgreSQL 10.0 压缩版的 pgAdmin 不能用的问题
查看>>
动态最小生成树讲解
查看>>
find命令
查看>>
Windows和Mac下安装Beautiful Soup
查看>>
Mac 配置android环境变量
查看>>
SkyLine二次开发——解决在web页面启动时自动运行TerraExplorer的问题
查看>>
约瑟夫环(Josehpuse)的模拟
查看>>
CSS小技巧
查看>>
正则匹配&nbsp;
查看>>
shell 读取文件
查看>>
给视图添加阴影
查看>>
数组2
查看>>