判断负环模板求助!!
查看原帖
判断负环模板求助!!
234783
conprour楼主2021/2/24 09:26

RT 下面是代码,里面有一行: while(!q.empty()) q.pop();//注意这里!!!!! 这一行写不写交到洛谷上都AC了,但是我在做一道站外的相同题的时候只有删掉这句话才可以AC,请问这句代码到底应不应该写呢?qwq

#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e3 + 5;
const int maxm = 6e3 + 10;
int head[maxm], vis[maxn];
long long dis[maxn];
int cntn[maxn];
int cnt;
int n, m, T;
queue<int> q;
struct edge {
    int to, nxt, w;
} a[maxm];
void add(int x, int y, int w) {
    a[++cnt].nxt = head[x];
    head[x] = cnt;
    a[cnt].to = y;
    a[cnt].w = w;
}
bool SPFA() {
    memset(dis, 0x7f, sizeof(dis));
    memset(vis, 0, sizeof(vis));  
                                  //	while(!q.empty()) q.pop();//注意这里!!!!!
    memset(cntn, 0, sizeof(cntn));
    q.push(1);
    dis[1] = 0;
    vis[1] = 1;
    //	cntn[1]=1;
    while (!q.empty()) {
        int u = q.front();
        q.pop();
        vis[u] = 0;
        for (int i = head[u]; i; i = a[i].nxt) {
            int v = a[i].to;
            if (dis[v] > dis[u] + a[i].w) {
                dis[v] = dis[u] + a[i].w;
                cntn[v] = max(cntn[v], cntn[u] + 1);
                cntn[v] = cntn[u] + 1;
                if (cntn[v] > m)
                    return true;
                if (!vis[v]) {
                    q.push(v);
                    vis[v] = 1;
                }
            }
        }
    }
    return false;
}
int main() {
    scanf("%d", &T);
    for (int k = 1; k <= T; k++) {
        cnt = 0;  //!!!
        for (int i = 1; i < maxm; i++) head[i] = 0;
        scanf("%d%d", &n, &m);
        int x, y, w;
        for (int i = 1; i <= m; i++) {
            scanf("%d%d%d", &x, &y, &w);
            add(x, y, w);
            if (w >= 0)
                add(y, x, w);
        }
        if (SPFA())
            printf("YE5\n");
        else
            printf("N0\n");
    }
    return 0;
}

2021/2/24 09:26
加载中...