社区讨论

蒟蒻求调

P2195HXY造公园参与者 1已保存回复 0

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@mdos7zo8
此快照首次捕获于
2025/07/30 00:59
7 个月前
此快照最后确认于
2025/07/30 02:05
7 个月前
查看原帖
CPP
#include <bits/stdc++.h>
using namespace std;

#define MXN 900010

int fa[MXN],size[MXN];

int find(int x){
	if(fa[x]==x){
		return x;
	}
	fa[x]=find(fa[x]);
	return fa[x];
}

void merge(int x,int y){
	x=find(x),y=find(y);
	if(x==y){
		return;
	}
	if(size[x]<size[y]){
		fa[x]=y;
		size[y]+=size[x];
	}else{
		fa[y]=x;
		size[x]+=size[y];
	}
}

struct node{
	int nxt,v;
};

node edge[MXN];
int head[MXN],cnt;

void addedge(int u,int v){
	edge[++cnt].nxt=head[u];
	edge[cnt].v=v;
	head[u]=cnt;
}

int n,m,qu;
int vis[MXN];
int maxdeep,maxp;

void dfs(int u,int deep,int fath){
	if(deep>maxdeep){
		maxp=u;
		maxdeep=deep;
	}
	for(int j=head[u];j!=0;j=edge[j].nxt){
		int v=edge[j].v;
		if(v==fath){
			continue;
		}
		dfs(v,deep+1,u);
	}
}

int main(){
	memset(size,1,sizeof(size));
	cin >> n >> m >>qu;
	for(int i=1;i<=n;i++){
		fa[i]=i;
		vis[i]=-1;
	}
	for(int i=0;i<m;i++){
		int u,v;
		cin >> u >> v;
		addedge(u,v);
		addedge(v,u);
		merge(u,v);
	}
	for(int i=1;i<=n;i++){
		int u=find(i);
		if(vis[u]==-1){
			maxdeep=-1;
			maxp=0;
			dfs(u,0,-1);
			maxdeep=-1;
			dfs(maxp,0,-1);
			u=find(u);
			vis[u]=maxdeep;
		}
	}
	for(int i=0;i<qu;i++){
		int opt;
		cin >> opt;
		if(opt==1){
			int x;
			cin >> x;
			int u=find(x);
			cout << vis[u] << endl;
		}else{
			int x,y;
			cin >> x >> y;
			x=find(x),y=find(y);
			if(x==y){
				continue;
			}
			merge(x,y);
			int t=find(x);
			vis[t]=int(floor(float(vis[x]+1)*0.5+1))+int(floor(float(vis[y]+1)*0.5+1))-1;
		}
	}
	return 0;
}

回复

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

正在加载回复...