bzoj 2330 糖果 差分約束
阿新 • • 發佈:2019-02-17
#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
struct bian
{
int to,d;
}b[1120005];
int fst[120005],nxt[1120005],tot=1;
long long dis[120005],inf=214748364;
void build(int f,int t,int d)
{
b[++tot].to=t;
b[tot].d=d;
nxt[tot]=fst[f];
fst[f]=tot;
}
queue <int> q;
bool use[120005];
int vis[120005];
int n,m;
bool h=0;
void spfa(int s)
{
use[s]=1;
q.push(s);
dis[s]=0;
int u,v;
while(!q.empty())
{
u=q.front();
q.pop();
use[u]=0;
for(int i=fst[u];i;i=nxt[i])
{
v=b[i].to;
if (dis[v]<dis[u]+b[i].d)
{
dis[v]=dis[u]+b[i].d;
if(!use[v])
{
use[v]=1;
q.push(v);
vis[v]=vis[u]+1;
if(vis[v]>n)
{
h=1 ;
return ;
}
}
}
}
}
}
int main()
{
scanf("%d%d",&n,&m);
int x,w,e,r;
for(int i=1;i<=m;i++)
{
scanf("%d",&x);
scanf("%d%d",&w,&e);
switch(x)
{
case(1):
build(w,e,0);
build(e,w,0);
break;
case(2):
build(w,e,1);
break;
case(3):
build(e,w,0);
break;
case(4):
build(e,w,1);
break;
case(5):
build(w,e,0);
break;
}
}
for(int i=1;i<=n;i++)
dis[i]=-inf;
for(int i=1;i<=n;i++)
{
if(dis[i]==-inf)
{
spfa(i);
if(h)
{
printf("-1");
return 0;
}
}
}
long long ans=0;
for(int i=1;i<=n;i++)
ans+=dis[i];
printf("%lld",ans+n);
return 0;
}