记录编号 |
172427 |
评测结果 |
AAAAAAAAAAA |
题目名称 |
[USACO 5.3] 校园网 |
最终得分 |
100 |
用户昵称 |
forever |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.003 s |
提交时间 |
2015-07-24 20:16:06 |
内存使用 |
0.46 MiB |
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
struct dd
{
int kaishi;
int zhong;
int next;
}jie[12000];
int Min(int h,int y)
{
if(h>y) return y;
return h;
}
int v[150],times,dfn[250],low[250],n,x;
int st[250],ans1,ans2,tot,num,gh[150];
int head[125],top,chu[150],ru[150];
void add(int x,int y)
{
tot++;
jie[tot].kaishi=x;
jie[tot].zhong=y;
jie[tot].next=head[x];
head[x]=tot;
}
void tar(int y)
{
times++;
dfn[y]=low[y]=times;
st[++top]=y,v[y]=1;
for(int i=head[y];i!=-1;i=jie[i].next)
{
int yu=jie[i].zhong;
if(!dfn[yu])
{
tar(yu);
low[y]=Min(low[y],low[yu]);
}
else
if(v[yu])
{
low[y]=Min(low[y],dfn[yu]);
}
}
if(low[y]==dfn[y])
{
++num;
int yulin;
do{
yulin=st[top--];
v[yulin]=0;
gh[yulin]=num;
}while(yulin!=y);
}
}
void work()
{
for(int i=1;i<=tot;++i)
if(gh[jie[i].kaishi]!=gh[jie[i].zhong])
{
chu[gh[jie[i].kaishi]]++;
ru[gh[jie[i].zhong]]++;
}
for(int i=1;i<=num;++i)
{
if(!ru[i]) ans1++;
if(!chu[i]) ans2++;
}
if(num==1)
{
printf("%d\n",1);
printf("%d",0);
}
else
{
printf("%d\n",ans1);
printf("%d\n",max(ans1,ans2));
}
}
int main()
{
freopen("schlnet.in","r",stdin);
freopen("schlnet.out","w",stdout);
memset(head,-1,sizeof(head));
scanf("%d",&n);
for(int i=1;i<=n;++i)
while(scanf("%d",&x)&&x)
{
add(i,x);
}
for(int i=1;i<=n;++i)
if(!dfn[i])
tar(i);
work();
//while(1);
}