这道题是差分约束加上最短路算法,
注意处理好点与点之间的关系和边的权值。
p.s:洛谷恶意卡spfa,建议写dijkstra
#include
#include
#include
#include
#include
#include
using namespace std;
int k,m,n,x,y,z,tp=0,head,tail,num=0;
int hea[100010],sz[300010],lb[300010],tai[1000010],tg[100010],nex[300010],d[100010],e[100010];
long long ans=0;
void add(int a,int b,int c)
{
nex[++tp]=hea[a];
hea[a]=tp;
sz[tp]=c;
lb[tp]=b;
}
int main()
{
memset(hea,-1,sizeof(hea));
scanf ("%d%d",&n,&k);
for (int i=n;i>=1;--i)
add(0,i,1);
for (int i=1;i<=k;i++)
{
scanf ("%d%d%d",&x,&y,&z);
if (x==1) {add(y,z,0);add(z,y,0);}
if (x==2) {add(y,z,1);if (y==z) {printf ("-1");return 0;}}
if (x==3) add(z,y,0);
if (x==4) {add(z,y,1);if (y==z) {printf ("-1");return 0;}}
if (x==5) add(y,z,0);
}
head=1;tail=1;tai[head]=0;e[0]=1;
while (head<=tail)
{
num++; if (num>=1000000) {printf ("-1");return 0;}
for (int i=hea[tai[head]];i!=-1;i=nex[i])
{
if (tg[lb[i]]=n) {printf ("-1");return 0;}
}
}
}
e[tai[head]]=0;
head++;
}
ans=0ll;
for (int i=1;i<=n;i++)
ans+=tg[i];
printf ("%lld",ans);
return 0;
}