救救孩子,为啥DEV里对交上去不对
查看原帖
救救孩子,为啥DEV里对交上去不对
1412841
BaiBaiShaFeng楼主2025/1/21 17:08
#include <bits/stdc++.h>
using namespace std;
int n; const int MN=5e6+516;
struct Node{
	int nxt, to;
}node[MN];int head[MN], tott;
inline void insert(int u, int v){
	node[++tott].nxt=head[u];
	node[tott].to=v;
	head[u]=tott;
	return;
}
int low[MN], dfn[MN], stk[MN], top=1, whole=0, vis[MN], belong[MN], bt=0;
void tarjan(int x){
	dfn[x]=low[x]=++whole;
	stk[++top]=x;
	vis[x]=1;
	for(int i=head[x];i;i=node[i].nxt){
		int v=node[i].to;
		if(!dfn[v]){
			tarjan(v);
			low[x]=min(low[x],low[v]);
		}else{
			if(vis[v]){
				low[x]=min(low[x],dfn[v]);
			}
		}
	}
	if(dfn[x]==low[x]){
		++bt;
		while(stk[top]!=x){
			int v=stk[top]; top--; vis[v]=-1;
			belong[v]=bt;
		}
		top--;vis[x]=0;
		belong[x]=bt;
	}
	return;
}
int out[MN], in[MN];
int main(){
	scanf("%d",&n);
	for(int i=1, r; i<=n; i++){
		while(1<114514){
			scanf("%d",&r);
			if(r==0) break;
			insert(i,r);////////
		}
	}
	for(int i=1; i<=n; i++){
		if(!dfn[i]) tarjan(i);
	}
	for(int u=1; u<=n; u++){
		for(int i=head[u];i;i=node[i].nxt){
			int v=node[i].to;
			if(belong[u]!=belong[v]){
				out[belong[u]]++;in[belong[v]]++;
			}
		}
	}
	int ans1, ans2;
	for(int i=1; i<=bt; i++){
		if(!in[i]) ans1++;
		if(!out[i]) ans2++;
	}
	if(bt==1){
		printf("1\n0");
		return 0;
	}
	printf("%d\n",ans1);
	printf("%d\n",max(ans1,ans2));
	return 0;
}
2025/1/21 17:08
加载中...