评测结果
#include <iostream>
#include <vector>
#include <cstring>
#define int unsigned long long
#define N 1005
using namespace std;
int n,m,u,v,dfn[N],low[N],tmp,ans,otto,zu,b[N],cut,R,ans2,len,kids;
int read(){
int x=0,f=1;char c=getchar();
for(;c<'0'||c>'9';c=getchar())f*=-1;
for(;c>='0'&&c<='9';c=getchar())x=x*10+c-'0';
return x*f;
}
vector<int>e[N];
int vis[N];
void Tarjan(int u){
kids=0;
dfn[u]=low[u]=++tmp;
for(auto v:e[u]){
if(!dfn[v]){
Tarjan(v);
low[u]=min(low[u],low[v]);
if(low[v]>=dfn[u]){
if(u==R)kids++;
b[u]=1;
}
}
else low[u]=min(low[u],dfn[v]);
}
if(u==R&&kids>=2)b[u]=1;
}
void dfs(int u,int d){
vis[u]=d;
len++;
for(int v:e[u]){
if(b[v]&&vis[v]!=d)vis[v]=d,cut++;
else if(!vis[v]) dfs(v,d);
}
return;
}
void init(){
for(int i=1;i<=n;i++)if(!e[i].empty())e[i].clear();
ans=tmp=n=zu=cut=len=0,ans2=1;
memset(dfn,0,sizeof(dfn));
memset(vis,0,sizeof(vis));
memset(low,0,sizeof(low));
memset(b,0,sizeof(b));
return;
}
signed main(){
while(1){
m=read();
if(!m)break;
init();
while(m--){
u=read(),v=read();
e[u].push_back(v);
e[v].push_back(u);
n=max(n,max(u,v));
}
for(int i=1;i<=n;i++)
if(!dfn[i])R=i,Tarjan(i);
for(int i=1;i<=n;i++){
if(vis[i]+b[i])continue;
len=cut=0;
dfs(i,++zu);
if(!cut)ans+=2,ans2*=((len-1)*len)/2;
if(cut==1)ans+=1,ans2*=len;
}
cout<<"Case "<<++otto<<": "<<ans<<" "<<ans2<<"\n";
}
return 0;
}
这下爽了(bushi