spfa


这道题要注意初始化w数组为最大值,并且w[1]=0;有负环的话输出YES,没有输出NO;

#include<iostream>
#include<queue>
#include<vector>
using namespace std;
const int N=3000+5;
struct node{
int id,dis;
};

int n,m;
void bfs(vector<node>v[N]){
    int cnt[N]={0};
    int vis[N]={0};
    int w[N]={0};
    for(int i=1;i<=n;i++)w[i]=1e8;
    
    w[1]=0;
    queue<int>q;
    q.push(1);
    while(!q.empty()){
        int x=q.front();
        q.pop();
        vis[x]=0;
        for(int i=0;i<v[x].size();i++){
            node u=v[x][i];
            if(v[x][i].dis+w[x]<w[u.id]){
                w[u.id]=v[x][i].dis+w[x];
                cnt[u.id]=cnt[x]+1;
                if(cnt[u.id]>=n){
                    cout<<"YES"<<endl;
                    return ;
                }
                if(!vis[u.id]){
                    q.push(u.id);
                    vis[u.id]=1;
                }
            }
        }
    }
    cout<<"NO"<<endl;
    return;
}
int main(){
    int t;
    cin>>t;
    while(t--){
        vector<node>v[N];
        cin>>n>>m;
        for(int i=1;i<=m;i++){
        int x,y,d;
        cin>>x>>y>>d;
        if(d>=0){
            v[x].push_back({y,d});
            v[y].push_back({x,d});
        }
        else v[x].push_back({y,d});
        }
        bfs(v);
    }
    return 0;
}
posted @ 2025-02-18 20:13  郭轩均  阅读(10)  评论(0)    收藏  举报