poj3259 Bellman_ford算法

来源:互联网 发布:linux 开机自启动 编辑:程序博客网 时间:2024/06/03 22:41
//poj3259 类似 poj1860, 探求能否出发,然后通过虫洞在出发前的时间点回来 //如果单源最短路径构造之后,发现还是可以继续构造下去,说明某条路可以实现时间一直减的效果//无限次走这条路,就可以达到目标。 //dist的初始化大小搞错了 害的我WA了1次,RE了2次。。 #include <iostream>#include <string>using namespace std;int num;  //边数 int dist[505];int inf = 10005;struct edge{int st;int ed;int w;}e[6000];void addEdge(int st, int ed, int t){e[num].st = st;e[num].ed = ed;e[num++].w = t;}bool CC(int nodeNum){for(int i = 0; i <= nodeNum; i++){dist[i] = inf;}dist[1] = 0;//构造单源(1)最短路径表bool flag = false; for(int i = 0; i < nodeNum; i++){for(int j = 0; j < num; j++){int u = dist[e[j].st];int v = dist[e[j].ed];if(v > u + e[j].w){dist[e[j].ed] = u + e[j].w;flag = true;}}if(!flag)break;} for(int i = 0; i < num; i++){if(dist[e[i].ed] > dist[e[i].st] + e[i].w) //如果还存在着负权环 return true;}return false;}int main(){int f;cin>>f;while(f--){num = 0;int n, m, worm;cin>>n>>m>>worm;int st, ed, t;for(int i = 0; i < m; i++){cin>>st>>ed>>t;addEdge(st, ed, t);addEdge(ed, st, t);}for(int i = 0; i < worm; i++){cin>>st>>ed>>t;addEdge(st, ed, -t);}bool ok = CC(n);if(ok)cout<<"YES"<<endl;elsecout<<"NO"<<endl;}return 0;}

0 0