一个图中有双向边和单向的负边,考虑有没有负圈
#include <cstdio>
#include <cstring>
const int maxn = 510;
const int maxm = 6000;
struct edge {
int from, to, cost;
};
edge es[maxm];
int d[maxn];
bool Bellman_Ford(int v, int e) {
memset(d, 0, sizeof(d));
for (int i = 0; i < v; i++) {
for (int j = 0; j < e; j++) {
edge l = es[j];
if (d[l.to] > d[l.from] + l.cost) {
d[l.to] = d[l.from] + l.cost;
if (i == v - 1)
return true;
}
}
}
return false;
}
int main(int argc, char const *argv[]) {
int f;
scanf("%d", &f);
for (int i = 0; i < f; i++) {
int n, m, w;
scanf("%d%d%d", &n, &m, &w);
int j = 0;
while (m--) {
int s, e, t;
scanf("%d%d%d", &s, &e, &t);
s--, e--;
es[j].from = es[j+1].to = s;
es[j].to = es[j+1].from = e;
es[j].cost = es[j+1].cost = t;
j += 2;
}
while (w--) {
int s, e, t;
scanf("%d%d%d", &s, &e, &t);
s--, e--;
es[j].from = s;
es[j].to = e;
es[j].cost = -t;
j++;
}
puts(Bellman_Ford(n, j) ? "YES" : "NO");
}
return 0;
}