#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e6+5;
struct node{
int to;
int dis;
};
vector<node>a[N];
int n,m;
int dis[N],cnt[N];
bool vis[N];
queue<int>q;
int ans;
void spfa(){
while(!q.empty()){
int x=q.front();
vis[x]=0;
cnt[x]=0;
q.pop();
for(int i=0;i<a[x].size();i++){
int v=a[x][i].to;
int w=a[x][i].dis;
if(dis[v]<dis[x]+w){
ans-=dis[v];
dis[v]=dis[x]+w;
ans+=dis[x]+w;
if(!vis[v]){
if(++cnt[v]>n){
printf("-1");
exit(1);
}
vis[v]=1;
q.push(v);
}
}
}
}
}
signed main(){
scanf("%lld%lld",&n,&m);
int flag=0;
while(m--){
int x;
int u,v;
scanf("%lld%lld%lld",&x,&u,&v);
if(x==1){
a[u].push_back(node{v,0});
a[v].push_back(node{u,0});
}
else if(x==2){
a[u].push_back(node{v,1});
}
else if(x==3){
a[v].push_back(node{u,0});
}
else if(x==4){
a[v].push_back(node{u,1});
}
else{
a[u].push_back(node{v,0});
}
if((x==2||x==4)&&u==v){
printf("-1");
return 0;
}
}
if(flag)printf("-1");
else{
q.push(0);
for(int i=1;i<=n;i++){
a[0].push_back(node{i,0});
q.push(i);
vis[i]=1;
dis[i]=1;
}
ans=n;
spfa();
printf("%lld",ans);
}
}
这是代码
TLE了一个点