负环36pts 貌似已清空vector
查看原帖
负环36pts 貌似已清空vector
270854
二叉苹果树楼主2022/8/1 22:04

貌似其他36pts都是因为没清空vector 可是我这里已经.clear()了啊

#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
using namespace std;
struct edge
{
    int v,w;
};
vector<edge> e[3005];
int dis[3005],inq[3005],cnt[3005];
queue<int>q;

bool spfa(int n,int s)
{
    for(int i=1;i<=n;i++)
        dis[i]=INT_MAX,inq[i]=false,cnt[i]=0;
    dis[s]=0,inq[s]=1,cnt[s]=1;
    q.push(s);
    while(!q.empty())
    {
        int u=q.front();
        q.pop();
        inq[u]=0;
        for(int j=0;j<e[u].size();j++)
        {
            edge ed=e[u][j];
            int v=ed.v,w=ed.w;
            if(dis[v]>dis[u]+w)
                dis[v]=dis[u]+w;
            if(!inq[v])
                q.push(v);
            inq[v]=1;
            cnt[v]++;
            if(cnt[v]>n)
                return true;
        }
    }
    return false;
}

int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        int n,m;
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        int u,v,w;
        cin>>u>>v>>w;
        if(w>=0)
        {
            e[u].push_back((edge){v,w});
            e[v].push_back((edge){u,w});
        }
        else
            e[u].push_back((edge){v,w});
    }
    if(spfa(n,1))
        cout<<"YES"<<endl;
    else
        cout<<"NO"<<endl;
    for(int i=1;i<=n;i++)
        e[i].clear();
    memset(dis,sizeof(dis),0);
    memset(inq,sizeof(dis),0);
    memset(cnt,sizeof(dis),0);
    }
    return 0;
}
2022/8/1 22:04
加载中...