刚学差分约束,求助QAQ
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=200010,M=400010;
ll n,m;
ll head[M],nxt[M],ver[M],edg[M],tot=0;
ll dis[N],cnt[N];
queue<int> q;
bool vis[N];
void add(int x,int y,int z)
{
ver[++tot]=y;
edg[tot]=z;
nxt[tot]=head[x];
head[x]=tot;
}
bool spfa()
{
memset(dis,-0x3f,sizeof dis);
dis[0]=0,vis[0]=1;
q.push(0);
while(q.size())
{
int x=q.front();
q.pop();
vis[x]=0;
for(int i=head[x];i;i=nxt[i])
{
int y=ver[i];
if(dis[y]<dis[x]+edg[i])
{
dis[y]=dis[x]+edg[i];
if(!vis[y])
{
cnt[y]++;
vis[y]=1;
q.push(y);
if(cnt[y]>n) return 0;//判正环
}
}
}
}
return 1;
}
int main()
{
scanf("%lld%lld",&n,&m);
// memset(head,-1,sizeof head);
bool flag=0;
for(int i=1;i<=m;i++)
{
int x,a,b;
scanf("%d%d%d",&x,&a,&b);
if(x==1) add(a,b,0),add(b,a,0);
if(x==2) add(a,b,1),flag=(a==b?1:flag);
if(x==3) add(b,a,0);
if(x==4) add(b,a,1),flag=(a==b?1:flag);
else add(a,b,0);
}
if(flag==1)
{
cout<<-1;
return 0;
}
for(int i=n;i>=1;i--)
add(0,i,1);
flag=spfa();
ll ans=0;
for(int i=1;i<=n;i++)
ans+=dis[i];
if(flag==0) printf("-1");
else printf("%lld",ans);
return 0;
}