记录编号 436427 评测结果 AAAAAAAAAA
题目名称 [HNOI 2012] 矿场搭建 最终得分 100
用户昵称 GravatarAnonymity 是否通过 通过
代码语言 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;
}