求助46
查看原帖
求助46
285617
黑影洞人楼主2021/10/6 14:29
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstring>
#define N 12505
using namespace std;
int head[N],to[N],nxt[N],tot,n,m,rh[N],rt[N],rn[N],cmp[N],cnt,ans,ans1,ind[N],oud[N];
vector<int >out;
bool vis[N];
void add(int u,int v){
	to[++tot]=v,rt[tot]=u;
	nxt[tot]=head[u],rn[tot]=rh[v];
	head[u]=tot,rh[v]=tot;
}
void dfs(int x){
	vis[x]=1;
	for(int i=head[x];i;i=nxt[i]){
		int y=to[i];
		if(!vis[y])dfs(y);
	}
	out.push_back(x);
}
void rd(int x,int ff){
	vis[x]=1;cmp[x]=ff;
	for(int i=rh[x];i;i=rn[i]){
		int y=rt[i];
		if(!vis[y])rd(y,ff);
	}
}
int kosaraju(){
	memset(vis,0,sizeof(vis));
	out.clear();
	for(int i=1;i<=n;i++)if(!vis[i])dfs(i);
	int f=0;
	memset(vis,0,sizeof(vis));
	for(int i=out.size()-1;i>=0;i--)if(!vis[out[i]])rd(out[i],f++);
	return f;
}
signed main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		m=0;
		scanf("%d",&m);
		while(m!=0){
			add(i,m);
			scanf("%d",&m);
		}
	}
	cnt=kosaraju();
	for(int i=1;i<=n;i++){
		for(int j=head[i];j;j=nxt[j]){
			int y=to[j];
			if(cmp[i]!=cmp[y]){
				ind[cmp[y]]++;oud[cmp[i]]++;
			}
		}
	}
	for(int i=1;i<=cnt;i++){
		if(ind[i]==0)ans++;
		if(oud[i]==0)ans1++;
		printf("%d %d\n",ind[i],oud[i]);
	}
	printf("%d\n",ans);
	if(cnt==1)printf("0");
	else printf("%d",max(ans1,ans));
	return 0;
}



2021/10/6 14:29
加载中...