记录编号 |
261569 |
评测结果 |
AAAAAAAAAAA |
题目名称 |
[USACO 5.3] 校园网 |
最终得分 |
100 |
用户昵称 |
FoolMike |
是否通过 |
通过 |
代码语言 |
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;
}