记录编号 261569 评测结果 AAAAAAAAAAA
题目名称 [USACO 5.3] 校园网 最终得分 100
用户昵称 GravatarFoolMike 是否通过 通过
代码语言 C++ 运行时间 0.003 s
提交时间 2016-05-17 21:46:23 内存使用 0.32 MiB
显示代码纯文本
#include<cstdio>
#include<algorithm>
#include<vector>
//#include"debug.h"
using namespace std;

int n,i,j,dfn[110],low[110],cnt,h[110],top,sum,fa[110],ans1,ans2;
vector <int> l[110];
bool vis[110],g[110][110],ru[110],chu[110],hash[110];

void dfs(int x){
	int i;
	vis[x]=1;
	low[x]=dfn[x]=++cnt;
	h[++top]=x;
	for (i=0;i<(int)l[x].size();i++){
		if (dfn[l[x][i]]==0){
			dfs(l[x][i]);
			low[x]=min(low[x],low[l[x][i]]);
		}
		else
		if (vis[l[x][i]]) low[x]=min(low[x],dfn[l[x][i]]);
	}
	if (low[x]==dfn[x]){
		for (i=top;h[i]!=x;i--) vis[h[i]]=0,low[h[i]]=low[x];
		vis[x]=0;top=i-1;
	}
}

int main()
{
	freopen("schlnet.in","r",stdin);
	freopen("schlnet.out","w",stdout); 
	scanf("%d",&n);
	for (i=1;i<=n;i++)
	while (1){
		scanf("%d",&j);
		if (j==0) break;
		l[i].push_back(j);
	}
	for (i=1;i<=n;i++)
	if (dfn[i]==0) dfs(i);
	
	for (i=1;i<=n;i++)
	for (j=0;j<(int)l[i].size();j++)
	if (low[i]!=low[l[i][j]]){
		if (!g[low[i]][low[l[i][j]]]) g[low[i]][low[l[i][j]]]=1;
		chu[low[i]]=ru[low[l[i][j]]]=1;
	}
	
	cnt=0;
	for (i=1;i<=n;i++)
	if (!vis[low[i]]&&!ru[low[i]])
		cnt++,vis[low[i]]=1;
	for (i=1;i<=n;i++)
	if (!hash[low[i]]){
		hash[low[i]]=1;
		sum++;
		ans1+=!chu[low[i]];
		ans2+=!ru[low[i]];
	}
	
	if (sum!=1) printf("%d\n%d\n",cnt,max(ans1,ans2));
		else printf("1\n0\n");
	return 0;
}