比赛 |
不准粘代码,必须自己写(HS除外) |
评测结果 |
AAAAAAAAAA |
题目名称 |
矿场搭建 |
最终得分 |
100 |
用户昵称 |
leon |
运行时间 |
0.006 s |
代码语言 |
C++ |
内存使用 |
13.69 MiB |
提交时间 |
2019-09-23 21:29:41 |
显示代码纯文本
#include <cstring>
#include <cstdio>
#include <cctype>
#include <queue>
#include <stack>
#include <iostream>
#define N 510
#define ll long long
using namespace std;
stack<int> sta;
ll n,m,tot,x1,x2,x3,cnt,t,top,v1,v2,ct,k,s1,s2=1;
ll head[N],dfn[N],low[N],vis[N],color[N],cut[N];
struct dd{
int next,to;
}a[N*2];
void add(int a1,int a2){
a[++tot].to=a2;
a[tot].next=head[a1];
head[a1]=tot;
}
void init(){
memset(a,0,sizeof(a));
memset(head,0,sizeof(head));
memset(dfn,0,sizeof(dfn));
memset(low,0,sizeof(low));
memset(vis,0,sizeof(vis));
memset(color,0,sizeof(color));
memset(cut,0,sizeof(cut));
while(!sta.empty()){
sta.pop();
}
s2=1;
s1=k=cnt=top=ct=tot=n=0;
}
void tarjan(ll x,ll fa){
dfn[x]=low[x]=++cnt;
for(ll i=head[x];i;i=a[i].next){
ll to=a[i].to;
if(!dfn[to]){
tarjan(to,x);
low[x]=min(low[x],low[to]);
if(low[to]>=dfn[x]){
if(x!=v1){cut[x]=1;}
else{v2++;}}}
else if(to!=fa) low[x]=min(low[x],dfn[to]);
}
}
void dfs(int x){
vis[x]=ct;
++k;
for(int i=head[x];i;i=a[i].next){
int to=a[i].to;
if(cut[to]&&vis[to]!=ct){
++cnt;
vis[to]=ct;
}
if(!vis[to]) dfs(to);}}
int main()
{
freopen("bzoj_2730.in","r",stdin);
freopen("bzoj_2730.out","w",stdout);
for(;;){
cin>>m;
if(m==0){
return 0;
}
else{
init();
for(int i=1;i<=m;i++){
cin>>x1>>x2;
add(x1,x2);
add(x2,x1);
n=max(n,x1);
n=max(n,x2);
}
for(int i=1;i<=n;i++){
v1=i;
v2=0;
if(dfn[i]==0)tarjan(i,0);
if(v2>=2)cut[i]=1;
}
for(int i=1;i<=n;++i){
if(!vis[i]&&!cut[i]){
++ct;k=cnt=0;dfs(i);
if(cnt==0) s1+=2,s2*=(k-1)*k/2;
if(cnt==1) s1+=1,s2*=k;
}
}
++t;
cout<<"Case "<<t<<": "<<s1<<" "<<s2<<endl;
}
}
return 0;
}