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