打了一下午全RE,我已经碎了
查看原帖
打了一下午全RE,我已经碎了
809371
Love_Natsu楼主2024/8/21 18:35

评测结果

#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

2024/8/21 18:35
加载中...