记录编号 |
300881 |
评测结果 |
AAAAAAAAAAA |
题目名称 |
[USACO 5.3] 校园网 |
最终得分 |
100 |
用户昵称 |
NewBee |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.025 s |
提交时间 |
2016-08-29 10:32:36 |
内存使用 |
0.35 MiB |
显示代码纯文本
#include<cstdio>
#define Cu fclose(stdin);fclose(stdout);return 0;
#define Begin freopen("schlnet.in","r",stdin);freopen("schlnet.out","w",stdout);chul();Cu;
using namespace std;
const int maxn=110;
struct op{
int to,next;
}r[maxn*maxn];
int head[maxn],clr[maxn],rd[maxn],cd[maxn],dfn[maxn],low[maxn],nrd=0,ncd=0,tim,cnt,col,n;
bool flag[maxn];
struct STACK{
int q[maxn],poi;
void clean(){
poi=0;
}
int top(){
return q[poi];
}
bool empty(){
if(poi>0)return 0;
return 1;
}
void push(int x){
q[++poi]=x;
}
void pop(){
poi--;
}
}q;
int min(int x,int y){
if(x>y)return y;
return x;
}
int max(int x,int y){
if(x>y)return x;
return y;
}
void insert(int fr,int to){
tim++;
r[tim].to=to;
r[tim].next=head[fr];
head[fr]=tim;
}
void tarjan(int x){
q.push(x);
flag[x]=1;
cnt++;
dfn[x]=low[x]=cnt;
int y;
for(int i=head[x];i;i=r[i].next){
y=r[i].to;
if(!dfn[y]){
tarjan(y);
low[x]=min(low[x],low[y]);
}
else if(flag[y]){
low[x]=min(low[x],dfn[y]);
}
}
if(low[x]!=dfn[x])return;
int t;col++;
do{
t=q.top();
q.pop();
flag[t]=0;
clr[t]=col;
}while(t!=x);
}
void lessenpoint(){
int y;
for(int i=1;i<=col;i++){
for(int j=1;j<=n;j++){
if(clr[j]!=i)continue;
for(int k=head[j];k;k=r[k].next){
y=r[k].to;
if(clr[y]==i)continue;
rd[clr[y]]++;
cd[i]++;
}
}
}
for(int i=1;i<=col;i++){
if(rd[i]==0)nrd++;
if(cd[i]==0)ncd++;
}
}
void chul(){
int x;scanf("%d",&n);
for(int i=1;i<=n;i++){
while(scanf("%d",&x),x!=0){
insert(i,x);
}
}
for(int i=1;i<=n;i++){
if(!dfn[i]){
q.clean();
tarjan(i);
}
}
if(col==1){
printf("1\n0");
return;
}
lessenpoint();
printf("%d\n%d",nrd,max(nrd,ncd));
}
int main(){
Begin;
}