博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NOIP2014 提高组 Day2——寻找道路
阅读量:6702 次
发布时间:2019-06-25

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

两遍spfa,第一遍反向看有哪些点不联通,标记上,第二次正向spfa,标记了的点不能用来更新。


1 #include 
2 #include
3 #include
4 #include
5 #include
6 #include
7 using namespace std; 8 const int maxn=1e4+5; 9 const int MAXN=2e5+5;10 const int inf=0x3f3f3f3f;11 int n,m,cnt,x[MAXN],y[MAXN],s,t,head[maxn],dis[maxn];12 bool vis[maxn],judge[maxn];13 struct edge{14 int v,nxt;15 }d[MAXN];16 queue
q;17 inline void add(int a,int b){18 d[++cnt].v=b;d[cnt].nxt=head[a];head[a]=cnt;19 }20 21 void spfa(int st){22 memset(vis,0,sizeof vis);23 memset(dis,63,sizeof dis);24 dis[st]=0;25 q.push(st);vis[st]=1;26 while(!q.empty()){27 int u=q.front();q.pop();vis[u]=1;28 for(int i=head[u];i;i=d[i].nxt){29 int v=d[i].v;30 if(judge[v])continue;31 if(dis[v]>dis[u]+1){32 dis[v]=dis[u]+1;33 if(!vis[v]){34 q.push(v);35 vis[v]=1;36 }37 }38 }39 }40 }41 42 int main(){43 scanf("%d%d",&n,&m);44 for(int i=1;i<=m;i++){45 scanf("%d%d",&x[i],&y[i]);46 add(y[i],x[i]);47 }48 scanf("%d%d",&s,&t);49 spfa(t);50 if(dis[s]==inf){51 printf("-1");52 return 0;53 }54 for(int i=1;i<=n;i++){55 if(dis[i]==inf){56 for(int j=head[i];j;j=d[j].nxt){57 judge[d[j].v]=1;58 }59 }60 }61 if(judge[s]==1){62 printf("-1");63 return 0;64 }65 cnt=0;memset(head,0,sizeof head);66 for(int i=1;i<=m;i++){67 add(x[i],y[i]);68 }69 spfa(s);70 if(dis[t]<=inf)printf("%d",dis[t]);71 else printf("-1");72 73 74 return 0;75 }

 

转载于:https://www.cnblogs.com/AT-HENS/p/7763690.html

你可能感兴趣的文章
tcpip学习
查看>>
yii2权限控制rbac之菜单menu最详细教程
查看>>
国内四大炒股软件APP 全面技术解析
查看>>
vncserver的安装和使用 2
查看>>
C++ STL--queue 的使用方法
查看>>
[svc]visio绘制模具
查看>>
springmvc入门基础之注解和参数传递
查看>>
iOS10 CoreData新特性
查看>>
absolute绝对定位的非绝对定位用法
查看>>
小白全栈
查看>>
struts2中struts.xml配置文件详解【未整理】
查看>>
基于Linux的智能家居的设计(5)
查看>>
身份识别协议枚举工具ident-user-enum
查看>>
正则则表达式大全(收集)
查看>>
手把手教你完成第一个vivado项目
查看>>
webpack-Module Resolution(模块解析)
查看>>
linux日志logger命令详解
查看>>
SQL SERVER 如果判断text类型数据不为空
查看>>
mongodb安全权限设定
查看>>
glib 散列表
查看>>