1. 程式人生 > >poj---Wormholes(蟲洞)

poj---Wormholes(蟲洞)

com tor class push min div fill .... ()

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\n"); else printf("NO\n"); for(int i=0;i<=maxn;i++){ G[i].clear(); } } return 0; }
View Code

poj---Wormholes(蟲洞)