MLE求调
查看原帖
MLE求调
395142
shenyiran楼主2023/2/10 11:09
#include<bits/stdc++.h>
using namespace std;
bool check[500005];
vector<int> ans[500005];
vector<int> G[500005];
stack<int> sta;
int bcc;
int n,dfn[500005],low[500005],cnt;
unsigned long long ans1,ans2;
void dfs(int u,int fa){
	dfn[u]=low[u]==++cnt;
	sta.push(u);
	int ch=0;
	for(auto v:G[u]){
		if(v==fa) continue;
		if(dfn[v]){
			low[u]=min(low[u],dfn[v]);
		}
		else{
			dfs(v,u);
			++ch;
			low[u]=min(low[u],low[v]);
			if(low[v]>=dfn[u]){
				bcc++;
				if(fa!=0) check[u]=1;
				while(sta.top()!=v){
					ans[bcc].push_back(sta.top());
					sta.pop();
				}
				ans[bcc].push_back(v);
				sta.pop();
				ans[bcc].push_back(u);
			}
		}
	}
	if(fa==0&&G[u].size()==0){
		ans[++bcc].push_back(u);
	}
	if(fa==0&&ch>=2) check[u]=1;
	return;
}
void init(){
	for(int i=1;i<=1000;i++) G[i].clear(),ans[i].clear();
	for(int i=1;i<=1000;i++) check[i]=dfn[i]=low[i]=0;
	bcc=cnt=0;
	ans1=0;
	ans2=1;
	while(!sta.empty()) sta.pop();
}
void solve(){
	init();
	for(int i=1;i<=n;i++){
		int u,v;
		cin>>u>>v;
		if(u==v) continue;
		G[u].push_back(v);
		G[v].push_back(u);
	}
	for(int i=1;i<=1000;i++){
		if(!dfn[i]&&G[i].size()){
			while(!sta.empty()) sta.pop();
			dfs(i,0);
		}
	}
	for(int i=1;i<=bcc;i++){
		unsigned long long u=ans[i].size();
		int q=0;
		for(auto ch : ans[i]) if(check[ch]==1) ++q;
		if(q==0){
			ans1+=2;
			ans2*=u*(u-1)/2;
		}
		else if(q==1){
			ans1++;
			ans2*=(u-1);
		}
	}
}
int main(){
	for(int i=1;;i++){
		cin>>n;
		if(n==0) break;solve();
		cout<<"Case "<<i<<": "<<ans1<<" "<<ans2<<"\n";
	}
	return 0;
}
2023/2/10 11:09
加载中...