76pts求调
查看原帖
76pts求调
1041884
_Liyx_楼主2024/9/5 20:43
#include<bits/stdc++.h>
using namespace std;
#define N 2005
#define M 10005
int head[N],nxt[M],edge[M],idx;
int dfn[N],low[N];
bool buc[N];
void add(int x,int y){
	edge[++idx]=y;
	nxt[idx]=head[x];
	head[x]=idx;
	return;
}
int n,m,a,b,cnt,ans;
stack<int> stk;
void Tarjan(int now){
	dfn[now]=low[now]=++cnt;
	stk.push(now);
	buc[now]=1;
	for(int i=head[now];i;i=nxt[i]){
		int v=edge[i];
		if(!dfn[v]){
			Tarjan(v);
			low[now]=min(low[now],low[v]);
		}
		else if(buc[v]) low[now]=min(low[now],low[v]);
	}
	if(dfn[now]==low[now]){
		int y=0,tmp=0;
		do{
			tmp++;
			y=stk.top();
			stk.pop();
			buc[y]=0;
		}while(y!=now);
		if(tmp>1) ans++;
	}
	return;
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		cin>>a>>b;
		add(a,b);
	}
	for(int i=1;i<=n;i++) if(!dfn[i]) Tarjan(i);
	cout<<ans; 
	return 0;
}

提交记录

2024/9/5 20:43
加载中...