求调或hark
查看原帖
求调或hark
1057461
flybirdyujunze楼主2025/7/28 21:17
#include <bits/stdc++.h>
#define maxn 200001
using namespace std;
int n,i,x,tot,y,ma,f[maxn],record[maxn];
int head[maxn],vis[maxn],dp[maxn],dp_re[maxn],dp_down[maxn];
struct no{
	int nxt,to;
}a[maxn];
void jb(int x,int y){
	a[++tot].to=y;
	a[tot].nxt=head[x];
	head[x]=tot;
}
void dfs_down(int u){
	vis[u]=1;
	if(!f[u]) dp_down[u]=dp_re[u]=0;
	for(int i=head[u];i;i=a[i].nxt){
		int v=a[i].to;
		if(vis[v]) continue;
		dfs_down(v);
		if(dp_down[u]<dp_down[v]+1) record[u]=v,dp_down[u]=dp_down[v]+1;
		else if(dp_re[u]<dp_down[v]+1) dp_re[u]=dp_down[v]+1;
	}
}
void dfs_dp(int u){
	vis[u]=0;
	if(!f[u]) dp[u]=max(0,dp[u]);
	for(int i=head[u];i;i=a[i].nxt){
		int v=a[i].to;
		if(!vis[v]) continue;
		if(dp_re[v]<dp_re[u]+1) dp_re[v]=dp_re[u]+1;
		int fv=(!(record[u]^v)?dp[u]-1:dp[u]+1);
		dp[v]=max(dp_down[v],dp_re[v]);
		if(fv>dp[v]) record[v]=0,dp[v]=fv;
		dfs_dp(v);
	}
}
int main(){
	cin>>n;
	for(i=1;i<=n;i++) cin>>f[i];
	for(i=1;i<=n;i++) dp_re[i]=dp[i]=dp_down[i]=-n;
	for(i=1;i<n;i++) cin>>x>>y,jb(x,y),jb(y,x);
	dfs_down(1);
	dp[1]=dp_down[1];
//	dfs_re(1);
	dfs_dp(1);
//	for(i=1;i<=n;i++)
//		cout<<dp[i]<<" "<<dp_down[i]<<" "<<dp_re[i]<<" "<<record[i]<<"\n";
	for(i=1;i<=n;i++)
		if(f[i]) ma=max(ma,dp[i]);
	cout<<ma;
}
2025/7/28 21:17
加载中...