社区讨论

邻接表 + SPFA 76pts,求优化

P3385【模板】负环参与者 2已保存回复 4

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
4 条
当前快照
1 份
快照标识符
@lo1lrgti
此快照首次捕获于
2023/10/22 23:07
2 年前
此快照最后确认于
2023/11/02 23:51
2 年前
查看原帖
CPP
#include <bits/stdc++.h>
using namespace std;
const int N = 2010,INF = 0x3f3f3f3f;
int t,n,m;
int g[N][N];
int d[N],cnt[N];
bool st[N];
bool spfa() {   
    for(int i = 1;i <= n;i++) {cnt[i] = st[i] = 0;d[i] = INF;}
    queue<int> q;
    d[1] = 0;
    st[1] = 1;
    q.push(1);
    while(q.size()) {
        int fr = q.front();
        q.pop();
        st[fr] = 0;
        for(int i = 1;i <= n;i++) {
            if(g[fr][i] == INF) continue;

            if(d[fr] + g[fr][i] < d[i]) {
                d[i] = d[fr] + g[fr][i];
                cnt[i] = cnt[fr] + 1;
                if(cnt[i] >= n) return true;
                if(!st[i]) {
                    st[i] = 1;
                    q.push(i);
                }
            }
        }
    }

    return false;
}
int main(){
    cin >> t;
    while(t--) {
        cin >> n >> m;
        memset(g,0x3f,sizeof(g));
        while(m--) {
            int a,b,c;
            cin >> a >> b >> c;
            if(c >= 0) g[b][a] = g[a][b] = min(c,g[a][b]);
            else g[a][b] = min(c,g[a][b]);
        }

        if(spfa()) cout << "YES" << endl;
        else cout << "NO" << endl; 
    }

    
    return 0;
}

回复

4 条回复,欢迎继续交流。

正在加载回复...