博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
code3731 寻找道路
阅读量:5290 次
发布时间:2019-06-14

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

将图反向,从终点spfa,把和终点没有联系的点找出来,

把它们和它们所连接的所有点删去(反向图)

然后再一遍spfa,输出最短路即可

 

代码:

#include
#include
#include
#define MAXM 200005#define MAXN 10005#define INF 0x3f3f3f3fusing namespace std;int n,m;struct edge{ int to,next,w;}eg[MAXM];int head[MAXN];int cnt=0;int s,t;int dist[MAXN];bool canUse[MAXN];bool vis[MAXN];void add(int a,int b,int w){ cnt++; eg[cnt].to=b; eg[cnt].next=head[a]; eg[cnt].w=w; head[a]=cnt;}void spfa(int st){ memset(dist,0x7f,sizeof(dist)); memset(vis,false,sizeof(vis)); queue
q; if(canUse[st]){ q.push(st); dist[st]=0; vis[st]=true; } while(!q.empty()){ int k=q.front(); q.pop(); vis[k]=false; for(int i=head[k];i!=-1;i=eg[i].next){ int u=eg[i].to; if(canUse[u]){ if(dist[u]>dist[k]+eg[i].w){ dist[u]=dist[k]+eg[i].w; if(!vis[u]){ vis[u]=true; q.push(u); } } } } }}int main(){ memset(canUse,true,sizeof(canUse)); memset(head,-1,sizeof(head)); cin>>n>>m; int a,b,w; for(int i=1;i<=m;i++){ cin>>a>>b; add(b,a,1); } cin>>s>>t; spfa(t); for(int i=1;i<=n;i++){ if(dist[i]>=INF){ //cout<<"Can't Use:"<
<
=INF)cout<<-1<

 

转载于:https://www.cnblogs.com/FuTaimeng/p/5611804.html

你可能感兴趣的文章
tomcat7.0.27的bio,nio.apr高级运行模式
查看>>
SAP HANA 三大特点
查看>>
C#预处理器命令
查看>>
苹果手表:大方向和谷歌一样,硬件分道扬镳
查看>>
ccf 出现次数最多的数
查看>>
单例模式
查看>>
Competing Consumers Pattern (竞争消费者模式)
查看>>
HDUOJ ------1398
查看>>
cf--------(div1)1A. Theatre Square
查看>>
Android面试收集录15 Android Bitmap压缩策略
查看>>
Tomcat 报错的解决方法:The APR based Apache Tomcat Native library which allows optimal
查看>>
最长公共子串问题(LCS)
查看>>
TortoiseSVN is locked in another working copy
查看>>
PHP魔术方法之__call与__callStatic方法
查看>>
ubuntu 安装后的配置
查看>>
Html学习_简易个人网页制作
查看>>
angular中ng-bind指令小案例
查看>>
jqery总结
查看>>
Lodop获取客户端主网卡ip地址是0.0.0.0
查看>>
VSCODE更改文件时,提示:EACCES: permission denied的解决办法(mac电脑系统)
查看>>