Tarjan 72pts求助
查看原帖
Tarjan 72pts求助
95170
Tune_楼主2023/10/12 20:29

评测记录

#include<bits/stdc++.h>
using namespace std;
int n,tot,dfn[105],low[105],scc[105],inst[105],cnt,sccin[105],in[105],out[105];
vector<int> e[105];
stack<int> st;
void tarjan(int x,int fa)
{
	dfn[x]=low[x]=++tot;
	st.push(x);
	inst[x]=1;
	for(int i=0;i<e[x].size();i++)
	{
		if(e[x][i]==fa)
			continue;
		if(dfn[e[x][i]]==0)
		{
			tarjan(e[x][i],x);
			low[x]=min(low[x],low[e[x][i]]);
		}
		else
			if(inst[e[x][i]])
				low[x]=min(low[x],dfn[e[x][i]]);
	}
	if(low[x]==dfn[x])
	{
		int y;
		++cnt;
		do
		{
			y=st.top();
			st.pop();
			inst[y]=0;
			scc[y]=cnt;
		}while(y!=x);
	}
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		int c;
		scanf("%d",&c);
		while(c!=0)
		{
			e[i].push_back(c);
			in[c]++;
			out[i]++;
			scanf("%d",&c);
		}
	}
	for(int i=1;i<=n;i++)
		if(!dfn[i])
			tarjan(i,0);
	for(int i=1;i<=n;i++)
	for(int j=0;j<e[i].size();j++)
		if(scc[i]!=scc[e[i][j]])
			sccin[scc[e[i][j]]]++;
	int a=0;
	for(int i=1;i<=cnt;i++)
		if(sccin[i]==0)
			a++;
	printf("%d\n",a);
	int s=0,t=0;
	for(int i=1;i<=n;i++)
	{
		if(in[i]==0)
			s++;
		if(out[i]==0)
			t++;
	}
	printf("%d",max(s,t));
	return 0;
}
2023/10/12 20:29
加载中...