POJ3259 Wormholes(Bellmanford判断负环)
来源:互联网 发布:数据挖掘导论 pdf 编辑:程序博客网 时间:2024/06/04 18:42
刚刚学了Bellmanford算法,于是找了道做过的模板题来试试手。当时直接用的模板,今天靠理解手打了一遍Bellmanford,进一步加深了理解。
Bellmanford算法,简而言之就是对一张有n个点的图的所有边,进行n-1次松弛操作。然后判断,如果仍然能进行第n次松弛操作,说明图里有负环,可以沿着这个负环不停地走下去让最短路径变为无穷小。
建图用的链式前向星。
前M条权值为正的边是双向边,后W条权值为负的是单向的。
#include <iostream>#include <cstring>#include <cstdio>#include <cmath>#include <vector>#include <algorithm>using namespace std;const int INF=0x3f3f3f3f;const int MAXN=1000;int dis[MAXN];int head[MAXN];struct edge{ int to,len,next;}E[8000];bool bellmanford(int n){ for(int i=2;i<=n;i++) dis[i]=INF; dis[1]=0; for(int i=1;i<=n-1;i++) //对链式前向星中共2M+W条边各执行n-1次松弛操作 { for(int j=1;j<=n;j++){ if(dis[j]==INF) continue; for(int k=head[j];k!=0;k=E[k].next){ //链式前向星编号从1开始,故以K!=0结束,若从0开始,改为k!=-1结束 if(E[k].len!=INF&&dis[E[k].to]>(dis[j]+E[k].len)){ dis[E[k].to]=dis[j]+E[k].len; } } } } for(int j=1;j<=n;j++){ //若经过以上n-1次松弛以后仍然能松弛,说明图中存在权值为负的环,无最短路径 for(int k=head[j];k!=0;k=E[k].next){ if(E[k].len!=INF&&dis[E[k].to]>(dis[j]+E[k].len)){ return false; //存在负环 } } } return true; //无负环}int main(){ int F,N,M,W,i,j,k; scanf("%d",&F); while(F--) { memset(head,0,sizeof(head)); scanf("%d%d%d",&N,&M,&W); memset(E,0,sizeof(E)); memset(dis,0,sizeof(dis)); for(i=1;i<=M;i++) //建立了编号从1到2M,共2M条边(前M条与后M条一一对应为反向边) { int index; scanf("%d%d%d",&index,&E[i].to,&E[i].len); E[i].next=head[index]; head[index]=i; E[i+M].to=index; E[i+M].len=E[i].len; E[i+M].next=head[E[i].to]; head[E[i].to]=i+M; } for(i=2*M+1;i<=2*M+W;i++) { int index; scanf("%d%d%d",&index,&E[i].to,&E[i].len); //建立了编号从2M+1到2M+W共W条边 E[i].len=E[i].len*(-1); E[i].next=head[index]; head[index]=i; } /* for(int j=1;j<=N;j++){ //测试,检查建边情况 for(int k=head[j];k!=0;k=E[k].next){ cout<<j<<" "<<E[k].to<<" "<<E[k].len<<endl; } } */ if(bellmanford(N)) { printf("NO\n"); } else printf("YES\n"); } return 0;}
阅读全文
0 0
- POJ3259 Wormholes(Bellmanford判断负环)
- POJ3259 Wormholes 【Bellmanford判断是否存在负回路】
- [POJ3259]Wormholes(负环)
- poj3259 Wormholes(floyd||spfa判断负环)
- POJ3259 Wormholes(spfa判断负环模板题)
- POJ3259 Wormholes 【SPFA判断负环】
- 【POJ3259】【Wormholes】【负环判断】【bell-ford】
- POJ3259----Wormholes(SPFA判断负环)
- POJ 3259 Wormholes (BellmanFord判断图是否存在负环)
- POJ3259 Wormholes【BellmanFord】
- POJ3259---Wormholes(最短路:验证存在负环)
- POJ3259 Wormholes(最短路,有无负环,spfa,模板)
- Wormholes (判断负环)
- POJ3259 Wormholes(Bellman-ford 负环)
- POJ3259 Wormholes 洛谷P3385 【模板】负环
- poj3259 Wormholes(bellman负权处理)
- poj3259 Wormholes BellmanFord或SPFA
- poj3259 负环的判断
- 今日已刷3题
- fl2440 添加 eeprom驱动,并测试
- MySQL数据库中的order
- VS2010编译CEF3源代码
- JavaScript-1-2:Object类型、Function类型、Array类型
- POJ3259 Wormholes(Bellmanford判断负环)
- ThreadLocal对request和response的使用
- 页面分页
- ccf201412-3集合竞价
- hdu 1247 HatWord ,Tries
- 51Nod 1304 字符串的相似度
- mysql 5.7.17 ,group by问题
- 机器学习学习笔记.day6
- Android发展史(Android各版本特性-知识篇)