题意:
给你
N
个点,
让你判断所给的图是否含有负权环。
要注意题目给了多组数据,一定要初始化数据。(无限次死在这儿
题目大致有两种做法:Floyd判断负权环 或者 spfa判断负权环。
spfa真的是不好调,在一些傻逼的地方卡了好久。
给自己挖个坑。Floyd还没写出来。
题目中
代码如下↓
spfa:
#include <cstdio>
#include <string.h>
#include <queue>
#define Maxn 3000
using namespace std;
struct node {
int w, v, next;
}edge[Maxn];
queue <int> q;
int cnt, T, n, m, w, u, v, W, dist[Maxn], Count[Maxn], p[Maxn];
bool inq[Maxn], ans;
void addedge(int u, int v, int w) {
edge[++cnt].v = v;
edge[cnt].next = p[u];
edge[cnt].w = w;
p[u] = cnt;
}
int main() {
scanf("%d", &T);
while (T --> 0) {
scanf("%d%d%d", &n, &m, &W);
for (int i = 1; i <= n; i++)
p[i] = 0;
for (int i = 1; i <= m; i++) {
scanf("%d%d%d", &u, &v, &w);
addedge(u, v, w);
addedge(v, u, w);
}
for (int i = 1; i <= W; i++) {
scanf("%d%d%d", &u, &v, &w);
addedge(u, v, -w);
}
for (int i = 2; i <= n; i++) {
dist[i] = 200000;
inq[i] = false;
Count[i] = 0;
}
queue <int> q;
inq[1] = 1;
dist[1] = 0;
q.push(1);
Count[1]++;
ans = false;
while (!q.empty()) {
u = q.front();
q.pop();
inq[u] = false;
for (int i = p[u]; i; i = edge[i].next) {
v = edge[i].v;
if (dist[v] > dist[u] + edge[i].w) {
dist[v] = dist[u] + edge[i].w;
Count[v]++;
if (!inq[v]) {
inq[v] = true;
q.push(v);
if (Count[v] >= n) {
ans = true;
goto T;
}
}
}
}
}
T: if (ans)
puts("YES");
else
puts("NO");
}
return 0;
}
Floyd
挖一个坑