蒟蒻刚学差分约束 55pts求调
查看原帖
蒟蒻刚学差分约束 55pts求调
625380
FriedrichC楼主2022/11/20 21:19
#include<bits/stdc++.h>
#define int long long
#define INF LLONG_MAX
#define maxn 2000010
using namespace std;
struct line{int to,pre,w;}b[maxn];
int head[maxn],t;
inline void ad(int x,int y,int z)
{
    t++;
    b[t].to=y;
    b[t].w=z;
    b[t].pre=head[x];
    head[x]=t;
}
int n,m;
bool in_q[maxn];
int dis[maxn],cnt[maxn];
bool spfa(int s)
{
    queue<int>q;
    for(int i=1;i<=n;++i)dis[i]=INF;
    memset(in_q,0,sizeof(in_q));
    memset(cnt,0,sizeof(cnt));
    dis[s]=0; in_q[s]=1;
    q.push(s);
    while(!q.empty())
    {
        int x=q.front();
        q.pop();
        in_q[x]=0;
        for(int i=head[x];i;i=b[i].pre)
        {
            int y=b[i].to;
            if(dis[y]>dis[x]+b[i].w)
            {
                dis[y]=dis[x]+b[i].w;
                if(!in_q[y])
                {
                    in_q[y]=1;
                    cnt[y]++;
                    if(cnt[y]==n+1)return 0;
                    q.push(y);
                }
            }
        }
    }
    return 1;
}
void init()
{
    t=0;
    memset(head,0,sizeof(head));
}
signed main()
{
    int w;
    cin>>w;
    while(w--)
    {
        init();
        cin>>n>>m;
        for(int i=1;i<=n;++i)ad(n+1,i,0);
        for(int i=1;i<=m;++i)
        {
            int x,y,z;
            cin>>x>>y>>z;
            ad(x-1,y,z); ad(y,x-1,-z);
        }
        if(!spfa(n+1))puts("false");
        else puts("true");
    }
	return 0;
}

2022/11/20 21:19
加载中...