差分约束模板
学习差分约束见 http://www.cnblogs.com/murmured/p/5004082.html
#include<bits/stdc++.h> using namespace std; const int maxn=100005; int n,m,cnt; int head[maxn],dis[maxn],cn[maxn]; bool vis[maxn]; long long ans; struct edge{ int next,to,w; }e[maxn*5]; void insert(int u,int v,int k){ cnt++; e[cnt].next=head[u];e[cnt].to=v;e[cnt].w=k; head[u]=cnt; } bool spfa(){ queue<int> q; q.push(0);vis[0]=1;cn[0]=1; while(!q.empty()){ int now=q.front(); vis[now]=0; q.pop(); for(int i=head[now];i;i=e[i].next){ int s=e[i].to; if(dis[s]<dis[now]+e[i].w){ if(++cn[s]>=n)return 0; dis[s]=dis[now]+e[i].w; if(!vis[s]){ vis[s]=1; q.push(s); } } } } return 1; } int main(){ scanf("%d%d",&n,&m); int x,a,b; for(int i=1;i<=m;i++){ scanf("%d%d%d",&x,&a,&b); if(x==1)insert(a,b,0),insert(b,a,0); if(x==2)if(a==b){printf("-1");return 0;}else insert(a,b,1); if(x==3)insert(b,a,0); if(x==4)if(a==b){printf("-1");return 0;}else insert(b,a,1); if(x==5)insert(a,b,0); } for(int i=n;i>=1;i--)insert(0,i,1); if(!spfa())printf("-1"); else{ for(int i=1;i<=n;i++)ans+=dis[i]; printf("%lld",ans); } return 0; }