求调
查看原帖
求调
595697
Papy楼主2024/4/3 00:01

写了个普通的spfa判负环对了,结果优化判断的条件的时候错了:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
typedef long long ll;
typedef double lf;
using namespace std;
const int INF = 1e9+7;
const int maxn = 2e3+5;
const int maxm = 3e3+5;
int T, n, m;
int dis[maxn], cnt[maxn], inD[maxn];
bool inq[maxn], check;

struct node{
    int v, w;
    int next;
}edge[maxm*2];
int head[maxn];
int cntE = 0;
void addedge(int u, int v, int w){
    edge[++cntE].v = v;
    edge[cntE].w = w;
    edge[cntE].next = head[u];
    head[u] = cntE;
}

void setup(){
    memset(dis, 0x3f, sizeof(dis));
    memset(inq, 0, sizeof(inq));
    memset(cnt, 0, sizeof(cnt));
    memset(edge, 0, sizeof(edge));
    memset(head, 0, sizeof(head));
    memset(inD, 0, sizeof(inD));
    n = 0; m = 0; cntE = 0;
    check = false;
}

void spfa(int s){
    queue<int> q;
    dis[s] = 0;
    q.push(s);
    inq[s] = 1;
    cnt[1]++;
    while (!q.empty()){
        int u = q.front();
        q.pop();

        inq[u] = 0;

        for (int i = head[u]; i; i = edge[i].next){
            int v = edge[i].v;
            int w = edge[i].w;

            if (dis[v] > dis[u]+w){
                dis[v] = dis[u]+w;

                if (inq[v] == 0){
                    q.push(v);
                    inq[v] = 1;
                    cnt[v]++;
                }
                
                //改成cnt[v] > n就AC了
                if (cnt[v] > inD[v]){
                    check = true;
                    return;
                }
            }
        }
    }
}

int main(){
    scanf("%d", &T);
    int s = 1;

    while (T--){
        setup();

        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){
                addedge(u, v, w);
                addedge(v, u, w);
                inD[u]++; inD[v]++;
            }else{
                addedge(u, v, w);
                inD[v]++;
            }
        }
        
        spfa(s);

        if (check){
            printf("YES\n");
        }else{
            printf("NO\n");
        }
    }



    return 0;
}

有没有大佬救命qwq

2024/4/3 00:01
加载中...