Tarjan55分求调!代码如下
查看原帖
Tarjan55分求调!代码如下
1063928
Gardenia_Scent楼主2024/7/10 14:33
#include<bits/stdc++.h>
using namespace std;
const int N=10005;
vector<int> e[N];
int d[N],low[N],tot;
int stk[N],in[N],top;
int sc[N],sz[N],cnt;
int n,din[N];
void tan(int x){
	d[x]=low[x]=++tot;
	stk[++top]=x,in[x]=1;
	for(int y:e[x]){
		if(!d[y]){
			tan(y);
			low[x]=min(low[x],low[y]);
		}
		else if(in[y])
			low[x]=min(low[x],d[y]);
	}
	if(d[x]==low[x]){
		int y;
		++cnt;
		do{
			y=stk[top--];
			in[y]=0;
			sc[y]=cnt;
		}while(y!=x);
	}
}
int main(){
	cin>>n;
	for(int i=1,a;i<=n;i++){
		while(cin>>a,a){
			e[i].push_back(a);
		}
	}
	for(int i=1;i<=n;i++)
	    if(!d[i])
		    tan(i);
	for(int x=1;x<=n;x++){
		for(auto y:e[x]){
			if(sc[x]!=sc[y]){
				din[sc[y]]++;
				d[sc[x]]++;
			}
		}
	}
	int a=0,b=0;
	for(int i=1;i<=cnt;i++){
		if(!din[i]) a++;
		if(!d[i]) b++;
	}
	cout<<a<<endl;
	if(cnt==1) cout<<"0"<<endl;
	cout<<max(a,b)<<endl;
    return 0;
}
2024/7/10 14:33
加载中...