可爱萌新刚学OI,tarjan88pts求调
查看原帖
可爱萌新刚学OI,tarjan88pts求调
1056908
封禁用户楼主2024/3/3 14:30
#include<bits/stdc++.h>
using namespace std;
const int N=1e4+100;
int n,m,u,v,top,cnt,ans,c,a[N],b[N],out[N],low[N],dfn[N],vis[N];vector<int>g[N];stack<int>st;
void dfs(int x){
	dfn[x]=low[x]=++top,vis[x]=1,st.push(x);
	for(auto i:g[x]){
		if(!dfn[i])dfs(i),low[x]=min(low[x],low[i]);
		else if(vis[i])low[x]=min(low[x],dfn[i]);
	}if(low[x]==dfn[x]){
		++cnt;
		while(st.top()!=x)a[st.top()]=cnt,++b[cnt],vis[st.top()]=0,st.pop();
		a[st.top()]=cnt,++b[cnt],vis[st.top()]=0,st.pop();
	}
}int main(){
	cin>>n>>m;
	for(int i=1;i<=m;i++)cin>>u>>v,g[u].push_back(v);
	dfs(1);
	for(int i=1;i<=n;i++)for(auto j:g[i])if(a[i]!=a[j])++out[a[i]];
	for(int i=1;i<=cnt;i++)if(!out[i])++c,ans+=b[i];
	return cout<<(c==1)*ans,0;
}
2024/3/3 14:30
加载中...