//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;
else
cout<<"NO"<<endl;
}
return 0;
}
poj3259 Bellman_ford算法
原文作者:Bellman - ford算法
原文地址: https://blog.csdn.net/chchlh/article/details/41490651
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
原文地址: https://blog.csdn.net/chchlh/article/details/41490651
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。