58f玄关
查看原帖
58f玄关
1093380
zhangfengkai001楼主2024/10/25 11:26
#include<bits/stdc++.h>
using namespace std;

const int N=1e5+5;
int n;
struct edge
{
	int f,t,next;
}e[N*2];
int head[N],esum=0,leap=0,temporary_point[N],point[N];
struct Point
{
	int lsum,maxx;
}P[N];

inline void init(int fr,int to)
{
	e[++esum]={ fr,to,head[fr] };
	head[fr]=esum;
}

void Dfs(int poin,int fa)
{
	bool tf=1;
	P[poin]={point[poin],0};
	for(int i=head[poin];i;i=e[i].next)
	{
		int y=e[i].t;
		if(y!=fa)
		{
			tf=0;
			Dfs(y,poin);
			P[poin].maxx+=P[y].maxx;
			P[poin].lsum+=P[y].lsum;
		}
	}
	if(tf) P[poin]={ point[poin],1 };
	else P[poin]={ min(P[poin].lsum,P[poin].maxx) , P[poin].maxx };
}

void dfs_leaf_node(int poin,int fa)
{
	bool tf=1;
	for(int i=head[poin];i;i=e[i].next)
	{
		int y=e[i].t;
		if(y!=fa)
		{
			tf=0;
			dfs_leaf_node(y,poin);
		}
	}
	if(tf) leap++;
}

int main()
{
	memset(head,0,sizeof(head));
	memset(point,0,sizeof(point));
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin>>n;
	int p;
	for(int i=1;i<=n;i++)
	{
		cin>>p;
		temporary_point[i]=p;
	}
	int u,v;
	for(int i=1;i<n;i++)
	{
		cin>>u
		   >>v;
		init(u,v);
		init(v,u);
	}
	dfs_leaf_node(1,0);
	for(int i=1;i<=leap;i++) point[temporary_point[i]]++;
	Dfs(1,0);
	cout<<P[1].lsum;
	return 0;
}	






2024/10/25 11:26
加载中...