社区讨论

70pts求条

P3225[HNOI2012] 矿场搭建参与者 3已保存回复 5

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
5 条
当前快照
1 份
快照标识符
@miimuj03
此快照首次捕获于
2025/11/28 17:00
3 个月前
此快照最后确认于
2025/11/29 15:15
3 个月前
查看原帖
CPP
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int M=2*1e6+10,N=5*1e5+10;
int n,cnt=1,h[N],u,v,cjs;
int dfn[N],low[N],sjz;
struct node{
	int to,next;
}e[2*M+10];
void add(int x,int y){
	++cnt;
	e[cnt].to=y;
	e[cnt].next=h[x];
	h[x]=cnt;
}
int bcc;
stack<int> tk;
vector<int> ans[N];
int gd[N];
void Tarjan(int u,int fa){
	++sjz;
	dfn[u]=sjz;
	low[u]=sjz;
	tk.push(u);
	if(u==fa&&h[u]==0){
		bcc++;
		ans[bcc].push_back(u);
	}
	for(int i=h[u];i;i=e[i].next){
		int v=e[i].to;
		if(dfn[v]==0){
			Tarjan(v,u);
			low[u]=min(low[u],low[v]);
			if(low[v]>=dfn[u]){
				gd[u]=1;
				bcc++;
				int t;
				do{
					t=tk.top();
					tk.pop();
					ans[bcc].push_back(t);
				}while(t!=v);
				ans[bcc].push_back(u);
			}
		}
		else{
			low[u]=min(low[u],dfn[v]);
		}
	}
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	while(cin>>n){
		if(n==0) break;
		cjs++;
		cnt=1;
		bcc=0;
		memset(h,0,sizeof h); 
		memset(gd,0,sizeof gd); 
		memset(low,0,sizeof low);
		memset(dfn,0,sizeof dfn); 
		for(int i=1;i<=n;i++) ans[i].clear();
		for(int i=1;i<=n;i++){
			cin>>u>>v;
			if(u!=v){
				add(u,v);
				add(v,u);
			}
		}
		for(int i=1;i<=n;i++){
			if(dfn[i]==0){
				while(!tk.empty()){
					tk.pop();
				}
				sjz=0;
				Tarjan(i,i);
			}
		}
		int wxy1=1,wxy2=0;
		for(int i=1;i<=bcc;i++){
			int gds=0;
			for(int a:ans[i]){
				if(gd[a]==1){
					gds++;
				}
			}
			if(ans[i].size()>1){
				if(gds==0){
					wxy1*=((ans[i].size()*(ans[i].size()-1))/2);
					wxy2+=2;
				}
				else if(gds==1){
					wxy1*=(ans[i].size()-1);
					wxy2++;
				}				
			}
		}
		printf("Case %lld: %lld %lld\n",cjs,wxy2,wxy1);
	}

	return 0;
}
变量名猎奇不要在意

回复

5 条回复,欢迎继续交流。

正在加载回复...