比赛 不准粘代码,必须自己写(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;
        }