spfa判断负环,全wa,求助
查看原帖
spfa判断负环,全wa,求助
1076206
leave20041225楼主2024/3/28 21:38
#include <string>
#include <iostream>
#include <algorithm>
#include <stack>
#include <deque>
#include <map>
#include <cstring>
#include <queue>

using namespace std;

const int N = 1000010;

int n, m, t;
struct edge{int v, w;};
int d[N], cnt[N], vis[N];
queue<int> q;
vector<edge> e[N];

bool spfa(int s)
{
    memset(cnt, 0, sizeof cnt);
    memset(vis, 0, sizeof vis);
    memset(d, 0x3f, sizeof d);
    while (!q.empty()) q.pop();
    d[s] = 0, vis[s] = 1, q.push(s);
    while (q.size())
    {
        int u = q.front();
        q.pop();
        vis[u] = 0;
        int len = e[u].size();
        for (int i = 0; i < len; i ++ )
        {
            int v = e[u][i].v, w = e[u][i].w;
            if (d[v] > d[u] + w)
            {
                d[v] = d[u] + w;
                cnt[v] = cnt[u] + 1;
                if (cnt[v] >= n) return true;
                if (!vis[v])
                {
                    q.push(v);
                    vis[v] = 1;
                }
            }
        }
    }
    return false;
}

int main()
{
    scanf("%d", &t);
    while (t -- )
    {
        scanf("%d%d", &n, &m);
        for (int i = 1; i <= m; i ++ )
        {
            int a, b, c;
            scanf("%d%d%d", &a, &b, &c);
            if (c >= 0)
            {
                e[a].push_back({b, c});
                e[b].push_back({a, c});
            }
            else
            {
                e[a].push_back({b, c});
            }
        }
        int f = spfa(1);
        if (f) printf("Yes\n");
        else printf("No\n");
        for (int i = 0; i <= n; i ++ ) e[i].clear();
    }
    return 0;
}
2024/3/28 21:38
加载中...