比赛 |
不准粘代码,必须自己写(HS除外) |
评测结果 |
AAAAAAAAAA |
题目名称 |
矿场搭建 |
最终得分 |
100 |
用户昵称 |
ShallowDream雨梨 |
运行时间 |
0.000 s |
代码语言 |
C++ |
内存使用 |
0.00 MiB |
提交时间 |
2019-10-02 16:24:01 |
显示代码纯文本
#include<bits/stdc++.h>
#define qwe cout<<"qwq"
#define ll long long
#define me(qwr) memset(qwr,0,sizeof(qwr))
using namespace std;const int maxn=1005;
ll qr,ans1,ans2,maxx,is,fei,qwq,tot,head[maxn],cut[maxn],f[maxn],child;
ll dfn[maxn],low[maxn],cnt;
ll vis[maxn];
void init(){
maxx=qwq=tot=cnt=0;
ans1=0;ans2=1;
me(head);me(vis);me(dfn);me(low);me(cut);me(f);}
struct _{int to,next;}a[maxn];
void add(int x,int y){
a[++tot].to=y;
a[tot].next=head[x];
head[x]=tot;}
void tarjan(int x){
cnt++;
dfn[x]=low[x]=cnt;
int child=0;
for(int i=head[x];i;i=a[i].next){
if(dfn[a[i].to]==0){
child++;
f[a[i].to]=x;
tarjan(a[i].to);
low[x]=min(low[x],low[a[i].to]);
if(low[a[i].to]>=dfn[x])cut[x]=1;}
else low[x]=min(low[x],dfn[a[i].to]);}
if(f[x]==0&&child==1)cut[x]=0;}
void dfs(int x){
//zushu
fei++;
vis[x]=qwq;
for(int i=head[x];i;i=a[i].next){
int to=a[i].to;
if(cut[to]==1&&vis[to]!=qwq)is++,vis[to]=qwq;
if(vis[to]==0)
dfs(to);}}
int wjr(){
freopen("bzoj_2730.in","r",stdin);
freopen("bzoj_2730.out","w",stdout);
ll n,q,w;
while(1){
cin>>n;
if(n==0)break;
init();
for(int i=1;i<=n;i++)
cin>>q>>w,add(q,w),add(w,q),
maxx=max(maxx,q),maxx=max(maxx,w);
for(int i=1;i<=maxx;i++)
if(dfn[i]==0)tarjan(i);
for(int i=1;i<=maxx;i++){
if(vis[i]==0&&cut[i]==0){
is=fei=0,qwq++,dfs(i);
if(is==0){
ans1++;ans1++;
ans2*=(fei-1)*fei/2;}
if(is==1){
ans1++;
ans2*=fei;}}}
qr++;
cout<<"Case "<<qr<<": "<<ans1<<" "<<ans2<<endl;
}
return 0; }
int sjm=wjr();
int main(){;
}