注意看题!!!
血的教训:要开long long
queue 换成 stack 会快很多
#include<bits/stdc++.h>
using namespace std;
int n,k;
int a,b,c;
struct oppo {
int to,next,s;
} rood[1000006];
int head[1000006],tot;
void add(int from,int to,int s) {
rood[++tot].to=to;
rood[tot].next=head[from];
rood[tot].s=s;
head[from]=tot;
}
int vis[1000006];
int t[1000006];
bool f[1000006];
stack< int > v;
void spfa()
{
vis[0]=0;
f[0]=1;
v.push(0);
while(v.size())
{
int lxl=v.top();
v.pop();
f[lxl]=0;
for(int i=head[lxl];i;i=rood[i].next)
{
int to=rood[i].to;
if(vis[lxl]+rood[i].s>vis[to])
{
vis[to]=vis[lxl]+rood[i].s;
t[to]++;
if(t[to]>n)
{
puts("-1");
exit(0);
}
if(!f[to])
{
f[to]=1;
v.push(to);
}
}
}
}
}
int main() {
cin>>n>>k;
for(int i=1; i<=n; i++)
add(0,i,1);
while(k--) {
scanf("%d %d %d",&a,&b,&c);
if(a==1) {
add(b,c,0);
add(c,b,0);
} else if(a==2) {
add(b,c,1);
} else if(a==3) {
add(c,b,0);
} else if(a==4) {
add(c,b,1);
} else if(a==5) {
add(b,c,0);
}
}
spfa();
long long ans=0;
for(int i=1;i<=n;i++)
ans+=vis[i];
cout<<ans<<endl;
return 0;
}