博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷 2269 寻找道路——图论
阅读量:5840 次
发布时间:2019-06-18

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

题目:

先从终点dfs一下能走到终点的,然后从起点bfs即可。O(n+m)。

#include
#include
#include
#include
using namespace std;const int N=1e4+5,M=2e5+5;int n,m,hd[N],xnt,to[M],nxt[M],st,en,thd[N],tnt,tto[M],txt[M];int q[N],he,tl,dis[N],k;bool vis[N],flag,fw[N];int rdn(){ int ret=0,fx=1; char ch=getchar(); while(ch>'9'||ch<'0'){ if(ch=='-') fx=-1; ch=getchar();} while(ch>='0'&&ch<='9') ret=(ret<<3)+(ret<<1)+ch-'0',ch=getchar(); return ret*fx;}void add(int x,int y){ to[++xnt]=y; nxt[xnt]=hd[x]; hd[x]=xnt;}void adt(int x,int y){ tto[++tnt]=y; txt[tnt]=thd[x]; thd[x]=tnt;}void dfs(int cr){ vis[cr]=1; for(int i=thd[cr],v;i;i=txt[i]) if(!vis[tto[i]]) dfs(tto[i]);}int main(){ n=rdn(); m=rdn(); for(int i=1,x,y;i<=m;i++) { x=rdn(); y=rdn(); add(x,y); adt(y,x); } st=rdn(); en=rdn(); dfs(en); if(!vis[st])flag=1; for(int i=hd[st];i;i=nxt[i]) if(!vis[to[i]]){flag=1;break;} if(flag){puts("-1");return 0;} q[tl=1]=st; fw[st]=1; while(he<=tl) { k=q[++he]; for(int i=hd[k],v;i;i=nxt[i]) if(vis[v=to[i]]&&!fw[v]) { flag=0; fw[v]=1; for(int j=hd[v];j;j=nxt[j]) if(!vis[to[j]]){flag=1;break;} if(!flag) { dis[v]=dis[k]+1; q[++tl]=v; if(v==en){printf("%d\n",dis[v]);return 0;} } } } puts("-1"); return 0;}

 

转载于:https://www.cnblogs.com/Narh/p/9641585.html

你可能感兴趣的文章
OSChina 周二乱弹 —— 假期余额已不足!
查看>>
前端那些事之React篇--helloword
查看>>
ios的google解析XML框架GDataXML的配置及使用
查看>>
netty-当一个客户端连接到来的时候发生了什么
查看>>
PHP_5.3.20 源码编译安装PHP-FPM
查看>>
在51CTO三年年+了,你也来晒晒
查看>>
js控制图片等比例缩放
查看>>
Java高级开发工程师面试考纲
查看>>
FreeMarker表达式
查看>>
Debian9.2 下使用vnstat查看服务器带宽流量统计
查看>>
NGINX + PHP-FPM 502
查看>>
mysql数据备份与恢复
查看>>
Openstack API常用命令
查看>>
OpenSSL漏洞凶猛来袭 慧眼恶意代码监测应对有方
查看>>
C语言 喝汽水问题
查看>>
LINUX中搭建DNS服务器,实现正向、反向以及访问不同DNS解析
查看>>
SCCM2012 R2实战系列之十:解决WDS服务无法启动问题(错误1067:进程意外终止)...
查看>>
怎么防止重复发送Ajax
查看>>
ubuntu 下安装 mysql
查看>>
关于k-means聚类算法的matlab实现
查看>>