您的位置:首页 > 其它

POJ 2359 Wormholes

2016-07-13 10:01 239 查看
bellman_ford 算法检查是否有负环。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;

const int inf = 0x3f3f3f3f;
int d[510],n,m,w;
struct Edge {
int v,e,value;
} edge[10000];

bool bellman_ford(int mm) {
memset(d,inf,sizeof(d));
d[1] = 0;
for(int i = 1;i <= n;i++) {//检查n次后如果还存在d[e] > d[v]+t,则存在负环,符合题意
bool flag = true;
for(int j = 0;j < mm;j++) {
int v = edge[j].v;
int e = edge[j].e;
int t = edge[j].value;
if(d[e] > d[v] + t) {
flag = false;
d[e] = d[v] + t;
}
}
if(flag) return false;
}
return true;
}

int main() {
int T;
scanf("%d",&T);
while(T--) {
scanf("%d%d%d",&n,&m,&w);
int v,e,t,tt = 0;
for(int i = 1;i <= m;i++) {
scanf("%d%d%d",&v,&e,&t);//这样不用查重因为循环n次后还是会选择最短的路径,比起二维数组节约空间
edge[tt].v = v;
edge[tt].e = e;
edge[tt++].value = t;
edge[tt].v = e;
edge[tt].e = v;
edge[tt++].value = t;
}
for(int i = 1;i <= w;i++) {
scanf("%d%d%d",&v,&e,&t);
edge[tt].v = v;
edge[tt].e = e;
edge[tt++].value = -t;
}
bool ans = bellman_ford(tt);
if(ans)
printf("YES\n");
else
printf("NO\n");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: