记录编号 87723 评测结果 AAAAAAAAAA
题目名称 [HNOI 2012] 矿场搭建 最终得分 100
用户昵称 GravatarChenyao2333 是否通过 通过
代码语言 C++ 运行时间 0.026 s
提交时间 2014-02-08 12:46:13 内存使用 2.02 MiB
显示代码纯文本
//cojs_1348

#include<stdio.h>
#include<stack>
#include<string.h>
#include<vector>
#include<stdlib.h>
#include<algorithm>

typedef unsigned long long ULL;

using namespace std;

const int MAXP=50000+10;

struct edge{
	int u,v;
};

struct BCC{
	int pre[MAXP];int dfs_clock;
	int iscut[MAXP];int bccno[MAXP];int bcc_cnt;
	vector<int> G[MAXP],bcc[MAXP];
	
	void init(){
		memset(pre,0,sizeof(pre));
		memset(iscut,0,sizeof(iscut));
		memset(bccno,0,sizeof(bccno));
		dfs_clock=bcc_cnt=0;
		for(int i=0;i<MAXP;i++){
			G[i].clear();
			bcc[i].clear();
		}
	}
	
	
	stack<edge> S;
	
	int dfs(int u,int fa){
		int lowu=pre[u]=++dfs_clock;
		int child=0;
		for(int i=0;i<G[u].size();i++){
			int v=G[u][i];
			edge e=(edge){u,v};
			if(!pre[v]){
				child++;
				S.push(e);
				int lowv=dfs(v,u);
				lowu=min(lowu,lowv);
				if(lowv>=pre[u]){
					iscut[u]=true;
					bcc_cnt++;bcc[bcc_cnt].clear();
					while(true){
						edge x=S.top();S.pop();
						if(bccno[x.u]!=bcc_cnt){
							bcc[bcc_cnt].push_back(x.u);
							bccno[x.u]=bcc_cnt;
						}
						if(bccno[x.v]!=bcc_cnt){
							bcc[bcc_cnt].push_back(x.v);
							bccno[x.v]=bcc_cnt;
						}
						if(x.u==u && x.v==v){break;}
					}
				}
			}else if(pre[v]<pre[u] && v!=fa){
				S.push(e);
				lowu=min(lowu,pre[v]);
			}
		}
		if(fa<0 && child==1){iscut[u]=false;}
		return lowu;
	}
	
	int find_bcc(int n){
		//init();
		for(int i=0;i<n;i++){
			if(!pre[i])dfs(i,-1);
		}
		return bcc_cnt;
	}
	
	void add_edge(int u,int v){
		G[u].push_back(v);
		G[v].push_back(u);
	}
	
}solver;

void solve(){
	int n,case_=0;
	scanf("%d",&n);
	while(n){
		case_++;
		solver.init();
		int a,b,maxn=0;
		for(int i=0;i<n;i++){
			scanf("%d %d",&a,&b);
			solver.add_edge(a,b);
			maxn=max(maxn,max(a,b));
		}
		int num=0;
		solver.find_bcc(maxn+1);
		ULL ans=1;
		for(int i=1;i<=solver.bcc_cnt;i++){
			int cut_num=0;
			for(int j=0;j<solver.bcc[i].size();j++){
				if(solver.iscut[solver.bcc[i][j]]){
					cut_num++;
					if(cut_num>1)break;
				}
			}
			if(cut_num==1){
				ans*=(solver.bcc[i].size()-1);
				num++;
			}
		}
		if(solver.bcc_cnt==1){
			num=2;
			int sz=solver.bcc[1].size();
			ans=(sz*(sz-1))/2;
		}
		printf("Case %d: %d %llu\n",case_,num,ans);
		scanf("%d",&n);
	}
}

void open(){
	freopen("bzoj_2730.in","r",stdin);
	freopen("bzoj_2730.out","w",stdout);
}

int main(){
	open();
	solve();
	//printf("%d",ans);
	return 0;
}