对拍

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MAXN=50001;
vector<int>edge[MAXN];
int instk[MAXN],dfn[MAXN],ss[MAXN],low[MAXN],belong[MAXN],in[MAXN],tot,stknum,ans,n,m;
vector<int>g[MAXN];
stack<int>stk;
void tarjan(int x){
	dfn[x]=low[x]=++tot,instk[x]=1;
	stk.push(x);
	for(int i:edge[x]){
		if(!dfn[i]){
			tarjan(i);
			low[x]=min(low[x],low[i]);
		}else if(instk[i]){
			low[x]=min(low[x],dfn[i]);
		}
	}
	if(dfn[x]==low[x]){
		int y;
		stknum++;
		do{
			y=stk.top();
			stk.pop();
			ss[stknum]++;
			instk[y]=0;
			belong[y]=stknum;
		}while(y!=x);
	}
}
signed main(){
	cin>>n>>m;
	if(n>m+1){
		cout<<0;
		return 0;
	}
	for(int i=1;i<=m;i++){
		int u,v;
		cin>>v>>u;
		edge[u].emplace_back(v);
	}
	for(int i=1;i<=n;i++){
		if(!dfn[i])tarjan(i);
	}
	for(int i=1;i<=n;i++){
		for(int j:edge[i]){
			if(belong[i]!=belong[j])in[belong[j]]++;
		}
	}
	int ans=0;
	for(int i=1;i<=stknum;i++){
		if(in[i]==0&&ans){
			cout<<0;
			return 0;
		}
		ans+=in[i]==0?ss[i]:0;
	}
	cout<<ans;
}

0 comments

No comments so far...

Information

ID
420
Time
1000ms
Memory
256MiB
Difficulty
7
Tags
# Submissions
56
Accepted
13
Uploaded By