标签:scan 差分约束系统 c++ pop else nod lld long return
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; }
标签:scan 差分约束系统 c++ pop else nod lld long return
原文地址:https://www.cnblogs.com/719666a/p/9571957.html