pku 3259 Wormholes(bellman-ford)

题目的意思就是要判断一下整个路网中有没有负权回路,而bellman-ford算法正好有这样的作用。因为bellman-ford算法只能扫描到那些和起始节点相连通的节点,这里我们给原路网增加一个超级起始节点s,s和其他所有节点都连通。

 

题目描述中有a bidirectional path between S and E,这里a bidirectional path 是双向路径的意思。

 

#include <iostream> using namespace std; struct node { int start,end; int time; }; node edge[2500*2+200+500+5]; int dist[500+5]; int N,M,W; bool solve(); int main() { int F; scanf("%d",&F); while(F--) { scanf("%d%d%d",&N,&M,&W); int first,second,time; for(int i=0;i<M;i++) { scanf("%d%d%d",&first,&second,&time); edge[2*i].start=first; edge[2*i].end=second; edge[2*i].time=time; edge[2*i+1].start=second; edge[2*i+1].end=first; edge[2*i+1].time=time; } for(int i=2*M;i<2*M+W;i++) { scanf("%d%d%d",&first,&second,&time); edge[i].start=first; edge[i].end=second; edge[i].time=-time; } for(int i=2*M+W;i<2*M+W+N;i++)//增加一个虚构的源点,将所有field连通起来 { edge[i].start=0; edge[i].end=i-2*M-W+1; edge[i].time=0; } if(solve()) printf("YES/n"); else printf("NO/n"); } return 0; } bool solve() { for(int i=1;i<=N;i++) { dist[i]=INT_MAX; } dist[0]=0; for(int i=0;i<N;i++) { for(int j=0;j<2*M+W+N;j++) { if(dist[edge[j].start]!=INT_MAX) { if(dist[edge[j].start]+edge[j].time<dist[edge[j].end]) dist[edge[j].end]=dist[edge[j].start]+edge[j].time; } } } for(int j=0;j<2*M+W+N;j++) { if(dist[edge[j].start]+edge[j].time<dist[edge[j].end]) return true; } return false; }

你可能感兴趣的:(算法,ini,Path)