求问负环模板
  • 板块学术版
  • 楼主CNS_5t0_0r2
  • 当前回复4
  • 已保存回复4
  • 发布时间2023/7/6 15:10
  • 上次更新2023/11/3 11:20:10
查看原帖
求问负环模板
999274
CNS_5t0_0r2楼主2023/7/6 15:10

92分,第9个点WA了

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 2 * 1e3 + 9,M = 1e6 + 9;
bool flag[N];
int dis[N];
int n,m,s = 1;
int u,v,w;
struct egde{
    int to,cost,nex;
} e[M];
int head[N],ecnt;
int cnt[N];
void addegde(int u,int v,int w){
    ecnt++;
    e[ecnt] = (egde){v,w,head[u]};
    head[u] = ecnt;
}
bool spfa(int s){
    queue<int>q;
    q.push(s);
    flag[s] = true;
    do{
        int x = q.front();
        q.pop();
        flag[x] = false;
        for(int i = head[x];i;i = e[i].nex){
            int v = e[i].to;
            if(dis[v] > e[i].cost + dis[x]){
                dis[v] = e[i].cost + dis[x];
                cnt[v] = cnt[x] + 1;
                if(cnt[v] >= n)
                    return true;
                if(!flag[v]){
                    flag[v] = true;
                    q.push(v);
                }
            }
        }
    }while(!q.empty());
    return false;
}
void proceed(){
    memset(flag,0,sizeof flag);
    memset(head,0,sizeof head);
    memset(cnt,0,sizeof cnt);
    scanf("%lld%lld", &n, &m);
    for(int i = 1;i <= n;i++)
        for(int j = head[i];j;j = e[j].nex)
            e[j] = (egde){0,0,0};
    for(int i = 1;i <= n;i++)
        if(i != s)
            dis[i] = 114514;
    for(int i = 1;i <= m;i++){
        scanf("%lld%lld%lld", &u, &v, &w);
        if(w >= 0){
            addegde(u,v,w);
            addegde(v,u,w);
        }
        else
            addegde(u,v,w);
    }
    if(spfa(1)){
        printf("YES\n");
        return;
    } 
    printf("NO\n");
}
int t;
signed main(){
    scanf("%lld", &t);
    for(int i = 1;i <= t;i++){
        proceed();
    }
}
2023/7/6 15:10
加载中...