6
2025-09-24 17:36:11
发布于:浙江
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
const int N=2e5+15;
int col[N];
int e[N],ne[N],h[N],idx,w[N];
int f[N],g[N],mxl;
int n;
int dfn[N],timestamp;
void add_in(int x,int y,int z){
e[idx]=y; ne[idx]=h[x]; w[idx]=z; h[x]=idx;
}
void dfs(int u,int fa){ //树的直径
dfn[u]=timestamp; //记录一下访问了该节点
int v;
f[u]=0;
for(int i=h[u];i;i=ne[i]){
v=e[i];
if(v==fa) continue;
dfs(v,u);
mxl=max(mxl,f[u]+f[v]+w[i]);
f[u]=max(f[u],f[v]+w[i]);
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i){
cin>>col[i];
}
int x,y;
for(int i=1;i<n;i){
cin>>x>>y;
if(col[x]==col[y]) continue; //两点颜色相同则不用建边
add_in(x,y,1);
add_in(y,x,1);
}
int res=0;
for(int i=1;i<=n;i++){
if(!dfn[i]) //该节点未被访问过
dfs(i,0);
}
cout<<mxl+1<<endl; //因为树的直径计算的是经过边的条数,因此需+1
return 0;
}
这里空空如也
有帮助,赞一个