题解:P10725 [GESP202406 八级] 最远点对
_zuoqingyuan · · 题解
思路分析
对于题目中所描述的最长路径
因为
更新答案时,为了避免
此时就避免了位于同一个子树中的问题。初始时所有
树形 dp,时间复杂度
\text{Code} :
#include <iostream>
#include <cstdio>
using namespace std;
const int N=1e5+10,inf=1e9+10;
int n,to[2*N],nxt[2*N],ver[N],c[N],idx,ans,dp[N][2];
void add(int x,int y){
to[++idx]=y,nxt[idx]=ver[x],ver[x]=idx;
}
void dfs(int x,int fa){
dp[x][0]=dp[x][1]=-inf;
dp[x][c[x]]=0;
for(int i=ver[x];i;i=nxt[i]){
if(to[i]==fa)continue;
int y=to[i];dfs(y,x);
ans=max(ans,max(dp[x][1]+dp[y][0],dp[x][0]+dp[y][1])+1);
dp[x][0]=max(dp[x][0],dp[y][0]+1);
dp[x][1]=max(dp[x][1],dp[y][1]+1);
}
return;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",c+i);
for(int i=1,u,v;i<n;i++){
scanf("%d %d",&u,&v);
add(u,v),add(v,u);
}
dfs(1,0);
printf("%d\n",ans);
return 0;
}
如有错误,请指出。