Tarjan 36分求助,悬赏关注
查看原帖
Tarjan 36分求助,悬赏关注
546681
lcbridgeAK CSP-S楼主2023/4/1 18:35
#include <bits/stdc++.h>
using namespace std;
const int MAXN=10005;
const int MAXM=100005;
vector <int> g[MAXM];
int n,m;
int dfn[MAXN],low[MAXN],cnt,ans,k,sc[MAXN],woodfill[MAXN],ind[MAXN];
bool vis[MAXN];
stack <int> st;
void Tarjan(int u){
	dfn[u]=low[u]=++cnt;
	st.push(u);
	vis[u]=1;
	for(int i=0;i<g[u].size();i++){
		int v=g[u][i];
		if(!dfn[v]){
			Tarjan(v);
			low[u]=min(low[u],low[v]);
		}
		else if(vis[v])low[u]=min(low[u],dfn[v]);
	}
	if(low[u]==dfn[u]){
		int v;
		ans++;
		do{
			v=st.top();
			st.pop();
			vis[v]=0;
			sc[v]=ans;
			woodfill[ans]++;
		}while(u!=v);
	}
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++){
		int u,v;
		scanf("%d%d",&u,&v);
		g[v].push_back(u);
	}
	for(int i=1;i<=n;i++)if(!dfn[i])Tarjan(i);
	for(int i=1;i<=n;i++){
		for(int j=0;j<g[i].size();j++){
			if(sc[i]!=sc[g[i][j]])ind[sc[i]]++;
		}
	}
	for(int i=1;i<=ans;i++){
		if(ind[i]==0){
			if(k){
				printf("0\n");
				return 0;
			}
			k=i;
		}
	}
	printf("%d",woodfill[k]);
	return 0;
}  

谢谢!

2023/4/1 18:35
加载中...