对一半0分求调
查看原帖
对一半0分求调
959548
youwhenway_second楼主2025/1/13 16:12
#include<bits/stdc++.h>
using namespace std;
int n;
bool a[1000005];
int belong[1000005],v1[1000005],v2[1000005],belcnt;
vector<int> g[1000005],g2[1000005];
void dfs(int u,int bel){
	belong[u]=bel;
	for (auto&v:g[u]){
		if (!belong[v]&&a[v]==a[u])dfs(v,bel);
	}
}
void dfs1(int u,int sum){
	v1[u]=sum;
	for (auto&v:g2[u]){
		if (v1[v]==-1)dfs1(v,sum+1);
	}
}
void dfs2(int u,int sum){
	v2[u]=sum;
	for (auto&v:g2[u]){
		if (v2[v]==-1)dfs2(v,sum+1);
	}
}
signed main(){
	cin>>n;
	for (int i=1;i<=n;cin>>a[i++]);
	for (int i=1;i<n;i++){
		int u,v;
		cin>>u>>v;
		g[u].push_back(v),g[v].push_back(u);
	}
	for (int i=1;i<=n;i++){
		if (!belong[i])belong[i]=++belcnt,dfs(i,belcnt);
		//cout<<belong[i]<<'\n'; 
	}
	for (int i=1;i<=n;i++){
		for (auto&v:g[i]){
			if (belong[i]!=belong[v])g2[belong[i]].push_back(belong[v]);
		}
	}
	memset(v1,-1,sizeof v1);
	memset(v2,-1,sizeof v2);
	dfs1(1,0);
	int maid=1;
	for (int i=1;i<=belcnt;i++){
		if (v1[i]>v1[maid])maid=i;
	}
	//cout<<maid<<'\n';
	dfs2(maid,1);
	int ma=1;
	for (int i=1;i<=belcnt;i++){
		if (v2[i]>v2[ma])ma=i;
		//cout<<v2[i];
	}
	//cout<<ma<<'\n';
	cout<<(v2[ma]+1)/2;
	return 0;
}
2025/1/13 16:12
加载中...