下面三个测试点过了,上面的一个没过
查看原帖
下面三个测试点过了,上面的一个没过
1284427
wudidepangzi楼主2024/5/6 18:45
#include <bits/stdc++.h>
using namespace std;
const int N = 2e3 + 100;
int n,T,m,u,v,w;
int cnt[N],st[N],dist[N];
struct nodes{
    int s,side;
};
vector<nodes> mp[N];


bool Spfa()
{
    //进行一些初始化
    queue<int> q;
    memset(dist,0x3f,sizeof dist);
    memset(cnt,0,sizeof cnt);
    memset(st,0,sizeof st);
    //开始Spfa算法
    dist[1] = 0;
    q.push(1);
    while(q.size())
    {
        int t = q.front();
        q.pop();
        st[t] = 0;
        for(int i=0;i<mp[t].size();i++){
            int a = mp[t][i].s;
            int b = mp[t][i].side;
            if(dist[a] > dist[t]+b){
                dist[a] = dist[t] + b;
                cnt[a] = cnt[t] + 1;
                if(cnt[a] >= n)//判断是否存在负环
                    return true;
                if(!st[a]){
                    q.push(a);
                    st[a] = 1;
                }
            }
        }
    }
    
    return false;
}


//用于解决问题
void solved()
{
    scanf("%d %d",&n,&m);
    for(int i=1;i<=m;i++){
        scanf("%d %d %d",&u,&v,&w);
        nodes a;
        a.s = v,a.side = w;
        mp[u].push_back(a);
    }
    if(Spfa()) printf("YES\n");
    else printf("NO\n");
    for(int i=1;i<=n;i++)
        mp[i].clear();
    return;
}

int main()
{
    scanf("%d",&T);
    while(T--)
        solved();
    
    return 0;
}
2024/5/6 18:45
加载中...