记录编号 |
436427 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[HNOI 2012] 矿场搭建 |
最终得分 |
100 |
用户昵称 |
Anonymity |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.009 s |
提交时间 |
2017-08-11 20:44:42 |
内存使用 |
1.31 MiB |
显示代码纯文本
#include<cstdio>
#include<iostream>
#include<cstring>
#define maxn 505
#define maxx 1005
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
inline int read()
{ char c=getchar();int x=0,y=1;
while(c<'0'||c>'9'){if(c=='-') y=-1;c=getchar();}
while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
return x*y;
}
typedef long long ll;
int n,num,hea[maxn],sum,st[maxx],top,cnt,bcc[maxn][maxn],low[maxn],dfn[maxn],bel[maxn],mk;
ll ans,fans=1;
bool ok[maxn];
struct road{int be,en,nex;}ro[maxx];
void add(int x,int y){ro[num].be=x;ro[num].en=y;ro[num].nex=hea[x];hea[x]=num++;}
void tarjan(int x,int y)
{ low[x]=dfn[x]=++mk;
int son=0,v;
for(int i=hea[x];i!=-1;i=ro[i].nex)
{ v=ro[i].en;
if(!dfn[v])
{ st[++top]=i;++son;
tarjan(v,x);
low[x]=min(low[x],low[v]);
if(low[v]>=dfn[x])
{ ok[x]=1;++sum;
while(1)
{ int tmp=st[top--];
if(bel[ro[tmp].be]!=sum) bcc[sum][++bcc[sum][0]]=ro[tmp].be,bel[ro[tmp].be]=sum;
if(bel[ro[tmp].en]!=sum) bcc[sum][++bcc[sum][0]]=ro[tmp].en,bel[ro[tmp].en]=sum;
if(ro[tmp].be==x&&ro[tmp].en==v) break;
}
}
}
else if(dfn[v]<dfn[x]&&v!=y) st[++top]=i,low[x]=min(low[x],dfn[v]);
}
if(y<0&&son==1) ok[x]=0;
}
void init()
{ mem(dfn,0);mem(low,0);mem(ok,0);mem(bel,0);mem(bcc,0);mem(hea,-1);
mk=sum=top=num=0;ans=0;fans=1;
}
void solve()
{ for(int i=1;i<=sum;i++)
{ int tmp=0;
for(int j=1;j<=bcc[i][0];j++) if(ok[bcc[i][j]]) ++tmp;
if(tmp==1) ans++,fans*=((ll)bcc[i][0]-tmp);
}
if(sum==1) ans=2,fans=((ll)bcc[1][0]*(bcc[1][0]-1))>>1;
}
int main()
{ freopen("bzoj_2730.in","r",stdin);
freopen("bzoj_2730.out","w",stdout);
while(scanf("%d",&n)==1&&n)
{ init();int x,y;
for(int i=1;i<=n;i++)
x=read(),y=read(),add(x,y),add(y,x);
for(int i=1;i<=n;i++) if(!dfn[i]) tarjan(i,-1);
solve();
printf("Case %d: %lld %lld\n",++cnt,ans,fans);
}
return 0;
}