poj---Wormholes(虫洞)
Posted sumaywlx
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了poj---Wormholes(虫洞)相关的知识,希望对你有一定的参考价值。
tips:
1.判断是否有负权回路
2.Bellman-ford算法
3.对每条边进行n-1次松弛
4.啊哈算法上讲的比较好,但是稍微有点错误
5.c++里的构造函数
//一直wa的原因是......每次结束后vector没有清空 //刚开始还以为是inf定义的不够大 //spfa做法可参考https://www.cnblogs.com/wangyiming/p/6351462.html #include<cstdio> #include<algorithm> #include<vector> using namespace std; const int maxn=510; const int inf=999000; int d[maxn]; int n,m; struct node{ int v; int w; node(int _v,int _w) : v(_v),w(_w){} }; vector<node> G[maxn]; bool bellman_ford(){ fill(d,d+maxn,inf); d[1]=0; for(int i=1;i<=n-1;i++){ for(int j=1;j<=n;j++){ for(int k=0;k<G[j].size();k++){ int v=G[j][k].v; int w=G[j][k].w; if(d[v]>d[j]+w) d[v]=d[j]+w; } } } for(int i=1;i<=n;i++){ for(int j=0;j<G[i].size();j++){ int v=G[i][j].v; int w=G[i][j].w; if(d[v]>d[i]+w) return true; } } return false; } int main(){ int T; int M,W; scanf("%d",&T); while(T--){ scanf("%d%d%d",&n,&M,&W); int x,y,z; for(int i=1;i<=M;i++){ scanf("%d%d%d",&x,&y,&z); //G[x][y].v=y;G[x].w=z; //G[y].v=x;G[y].w=z;//双向建边 G[x].push_back(node(y,z)); G[y].push_back(node(x,z)); } for(int i=1;i<=W;i++){ scanf("%d%d%d",&x,&y,&z); G[x].push_back(node(y,-z)); } if(bellman_ford()) printf("YES "); else printf("NO "); for(int i=0;i<=maxn;i++){ G[i].clear(); } } return 0; }
以上是关于poj---Wormholes(虫洞)的主要内容,如果未能解决你的问题,请参考以下文章
POJ Wormholes 最短路径 ballman_ ford 有负环