SPFA判负环 WA 8个点求助/kel
查看原帖
SPFA判负环 WA 8个点求助/kel
320697
AMIRIOX無暝楼主2021/2/23 16:20
#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
using namespace std;
const int maxn = 2e5 + 10;
struct edge {
    int to, w, nxt;
} g[maxn];
int tot, head[maxn];
void add(int u, int to, int w) {
    g[++tot].to = to;
    g[tot].w = w;
    g[tot].nxt = head[u];
    head[u] = tot;
}
int inq[maxn], dis[maxn];
int cnt[maxn];
int n, m;

bool SPFA() {
    queue<int> q;
    memset(inq, 0, sizeof(inq));
    memset(cnt, 0, sizeof(cnt));
    memset(dis, 0x3f, sizeof(dis));
    dis[1] = 0;
    q.push(1);
    inq[1] = 1;
    while (!q.empty()) {
        int u = q.front();
        q.pop();
        inq[u] = 0;
        for (int i = head[u]; i; i = g[i].nxt) {
            int v = g[i].to, w = g[i].w;

            if (dis[v] > dis[u] + w) {
                dis[v] = dis[u] + w;
                cnt[v] = cnt[u] + 1;
                if (cnt[v] >= n)
                    return true;
                if (!inq[v]) {
                    q.push(v);
                    inq[v] = 1;
                }
            }
        }
    }
    return false;
}
int main() {
    int t;
    scanf("%d", &t);
    while (t--) {
        scanf("%d %d", &n, &m);
        for (int i = 1; i <= m; i++) {
            int u, v, w;
            scanf("%d %d %d", &u, &v, &w);
            if (w >= 0) {
                add(u, v, w);
                add(v, u, w);
            } else {
                add(u, v, w);
            }
        }
        bool haveFH = SPFA();
        printf("%s\n", haveFH ? "YES" : "NO");
    }

    return 0;
}
2021/2/23 16:20
加载中...