tarjan全wa求调!!!
查看原帖
tarjan全wa求调!!!
442615
zhao2008楼主2023/11/28 17:49
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int n,m,x,y,rd[N],cd[N],ans;
vector<int> e[N];
int t,dfn[N],low[N],scc[N],siz[N],cnt;
bool vis[N];
stack<int> s;
void dfs(int k){
	dfn[k]=low[k]=++t;
	s.push(k);vis[k]=1;
	for(int i=0;i<e[k].size();i++){
		int v=e[k][i];
		if(dfn[v]==0){
			dfs(v);
			low[k]=min(low[k],low[v]);
		}
		else if(vis[k]==1)
				low[k]=min(low[k],low[v]);
	}
	if(dfn[k]==low[k]){
		cnt++;
		while(s.top()!=k){
			int tmp=s.top();s.pop();
			scc[tmp]=cnt,vis[tmp]=0,siz[cnt]++;
		}
		s.pop();
		scc[k]=cnt,vis[k]=0,siz[cnt]++;
	}
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		scanf("%d%d",&x,&y);
		e[x].push_back(y);
	}
	for(int i=1;i<=n;i++)
		if(dfn[i]==0)
			dfs(i);
	for(int i=1;i<=cnt;i++)
		ans=max(ans,siz[i]);
	cout<<ans<<endl;
	for(int i=1;i<=n;i++)
		for(int j=0;j<e[i].size();j++){
			x=scc[i],y=scc[e[i][j]];
			if(x!=y)
				cd[x]++,rd[y]++;
		}
	x=0,y=0;
	for(int i=1;i<=cnt;i++){
		if(rd[i]==0)
			x++;
		if(cd[i]==0)
			y++;
	}
	ans=max(x,y);
	if(siz[1]==n)
		cout<<0;
	else
		cout<<ans;
	return 0;
}
2023/11/28 17:49
加载中...