记录编号 344220 评测结果 AAAAAAAAAA
题目名称 [HNOI 2012] 矿场搭建 最终得分 100
用户昵称 GravatarHzoi_Queuer 是否通过 通过
代码语言 C++ 运行时间 0.019 s
提交时间 2016-11-10 06:14:28 内存使用 0.27 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int maxn=505;
#define LL long long
struct Edge{
	int to,next;
}e[maxn];
int n,m,len,rt,son,ans,cnt,tot,Node,Case=0,Time,head[maxn],dfn[maxn],Low[maxn],vis[maxn];
LL f;
bool flag[maxn],Gd[maxn];
void Insert(int x,int y){
	len++;e[len].to=y;e[len].next=head[x];head[x]=len;
}
void Tarjan(int x){
	Low[x]=dfn[x]=++Time;
	for(int i=head[x];i!=-1;i=e[i].next){
		int j=e[i].to;
		if(!dfn[j]){
			Tarjan(j);
			if(x==rt)son++;
			else{
				Low[x]=min(Low[x],Low[j]);
				if(Low[j]>=dfn[x] && !Gd[x])Gd[x]=1;	
			}
		}
		else Low[x]=min(Low[x],dfn[j]);
	}
}
void Dfs(int x){
	flag[x]=0;
	for(int i=head[x];i!=-1;i=e[i].next){
		int j=e[i].to;
		if(!flag[j])continue;
		if(Gd[j] && vis[j]!=tot)vis[j]=tot,cnt++;
		else if(!Gd[j]){
			Node++;Dfs(j);
		}
	}
}
int main()
{
	freopen("bzoj_2730.in","r",stdin);
	freopen("bzoj_2730.out","w",stdout);
	while(scanf("%d",&m)){
		if(m==0)break;int x,y;
		memset(head,-1,sizeof head);
		memset(flag,0,sizeof flag);
		memset(dfn,0,sizeof dfn);
		memset(Low,0,sizeof Low);
		memset(Gd,0,sizeof Gd);
		n=0,len=0;Time=0;rt=-1;f=1ll;ans=0;Case++;
		for(int i=1;i<=m;i++){
			scanf("%d%d",&x,&y);
			if(!flag[x])flag[x]=1,n++;
			if(!flag[y])flag[y]=1,n++;
			Insert(x,y);Insert(y,x);
		}
		for(int i=1;i<=m;i++){
			if(flag[i] && !dfn[i]){
				rt=i;son=0;
				Tarjan(i);
				if(son>1 && !Gd[i])Gd[i]=1;
			}
		}
	//	for(int i=1;i<=m;i++)if(Gd[i])printf("%d ",i);printf("\n");
		for(int i=1;i<=m+1;i++){
			if(!flag[i])continue;
			if(!Gd[i]){
				cnt=0;Node=1;tot++;Dfs(i);
				if(!cnt)ans+=2,f=f*Node*1ll*(Node-1)/2;
				else if(cnt==1)ans++,f=Node*1ll*f;
			}
		}
		printf("Case %d: %d %lld\n",Case,ans,f);
	}
	return 0;
}