30pts,只能过特殊性质,求条
查看原帖
30pts,只能过特殊性质,求条
889917
limingyuan333楼主2025/2/8 16:23
#include<bits/stdc++.h>
#define ull unsigned long long
#define int long long
#define pii pair<int,int>
#define se second
#define fi first
using namespace std;
const int MAXN=1e6+10;
int n,w[MAXN],mx[MAXN];
struct node{
	int to,nxt;
}a[MAXN<<1];
int head[MAXN],tot,dis[MAXN];
pii dp[MAXN][2];
void add(int x,int y){
	a[++tot].to=y;
	a[tot].nxt=head[x];
	head[x]=tot;
}
void dfs1(int now,int fa,int dep){
	dis[now]=dep;dp[now][0]=make_pair(now,dep);bool f=0;
	for(int i=head[now];i;i=a[i].nxt){
		int to=a[i].to;
		if(to==fa)	continue;f=1;
		if(w[now]==w[to]) dfs1(to,now,dep);
		else	dfs1(to,now,dep+1);
		if(dp[to][0].se>=dp[now][0].se)	dp[now][1]=dp[now][0],dp[now][0]=make_pair(to,dp[to][0].se);
		else if(dp[to][0].se>=dp[now][1].se)	dp[now][1]=make_pair(to,dp[to][0].se);
	}
	if(!f&&(!w[now]))	dp[now][0]=make_pair(-1,-1);
}
void dfs2(int now,int fa){
	for(int i=head[now];i;i=a[i].nxt){
		int to=a[i].to;
		if(to==fa)	continue;
		mx[to]=mx[now];
		if(w[now]!=w[to])mx[to]++;
		if(dp[now][0].fi!=to)	mx[to]=max(mx[to],dp[now][0].se-dis[now]+1+(w[now]!=w[to]));
		else if(dp[now][1].fi!=now)	mx[to]=max(mx[to],dp[now][1].se-dis[now]+1+(w[now]!=w[to]));
		dfs2(to,now);	
	}
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(NULL),cout.tie(NULL);
	cin>>n;
	for(int i=1;i<=n;i++)	cin>>w[i];
	for(int i=1;i<n;i++){
		int u,v;cin>>u>>v;
		add(u,v),add(v,u);
	}
	dfs1(1,0,1);
	dfs2(1,0);int ans=n; 
	for(int i=1;i<=n;i++)	ans=min(ans,max(dp[i][0].se-dis[i]+1,mx[i]));
	cout<<ans;
	return 0;
}
2025/2/8 16:23
加载中...