差分约束系统 :糖果

https://loj.ac/problem/2436

#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
long long n,k,x,a,b;
struct node{
    long long to,next,w;
}e[300005];
long long head[300005],num=0;
void add(long long x,long long y,long long c)
{
    e[++num].next=head[x],e[num].to=y,e[num].w=c,head[x]=num;
}
long long dis[100005];
bool vis[100005];
queue<long long>q;
long long times[100005];
void spfa()
{
    memset(dis,0,sizeof dis);
    memset(vis,0,sizeof vis);
    memset(times,0,sizeof times);
    q.push(0);
    vis[0]=1;
    dis[0]=0;
    while(!q.empty())
    {
        long long u=q.front();
        q.pop();
        vis[u]=0;
        for(long long i=head[u];i!=-1;i=e[i].next){
            long long v=e[i].to;
            if(dis[v]<dis[u]+e[i].w)
            {
                times[v]++;
                if(times[v]>=n){
                    cout<<-1;exit(0);
                }
                dis[v]=dis[u]+e[i].w;
                if(!vis[v])
                {
                    q.push(v);vis[v]=1;
                }
            }
        }
    }
    long long ans=0;
    for(long long i=1;i<=n;i++)
    {
        ans+=dis[i];
    }
    printf("%lld",ans);
    return;
}
int main()
{
    
    memset(head,-1,sizeof head);
    scanf("%d%d",&n,&k);
    for(long long i=1;i<=k;i++)
    {
        int x,y,z;scanf("%d%d%d",&x,&y,&z);
        if(x==1)add(y,z,0),add(z,y,0);
        else if(x==2){if(y==z){cout<<"-1";return 0;}add(y,z,1);}
        else if(x==3)add(z,y,0);
        else if(x==4){if(y==z){cout<<"-1";return 0;}add(z,y,1);}
        else if(x==5)add(y,z,0);
    }
    for(int i=n;i;--i)add(0,i,1);
    spfa();
    return 0;
} 

   

原文地址:https://www.cnblogs.com/719666a/p/9571957.html