比赛 EYOI常规赛 1st 评测结果 WWWWWWWWWW
题目名称 树染色 最终得分 0
用户昵称 遥时_彼方 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2021-12-02 21:49:56
显示代码纯文本
#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
using namespace std;
int nc;
int pw[10001];
int g;
int st[10001];
ull ans;
struct tre
{
	int ar;
	int nx;
}n[100001];
int nj;
struct DL
{
	int ar;
	int p;
};
struct cmp
{
	bool operator ()(DL x,DL y)
	{
		return x.p<y.p;	
	}	
};
priority_queue<DL,vector<DL>,cmp> a; 
void ADD(int x,int y)
{
	n[++nj].ar=y;
	n[nj].nx=st[x];
	st[x]=nj;
	return;
}
int lj[100001];
void CL()
{
	int cl=0;
	DL sum;
	sum.ar=g;
	sum.p=0;
	a.push(sum);
	lj[g]=1;
	DL now;
	while(a.size())
	{
		now=a.top();
		a.pop();
		cl++;
		ans+=cl*pw[now.ar];
		for(int i=st[now.ar];i;i=n[i].nx)
		{
			if(lj[n[i].ar]) continue;
			sum.ar=n[i].ar;
			sum.p=pw[n[i].ar];
			a.push(sum);
			lj[n[i].ar]=1;
		}
	}
	return;
}
int main()
{
	freopen("colortree.in","r",stdin);
	freopen("colortree.out","w",stdout);
	scanf("%d%d",&nc,&g);
	for(int i=1;i<=nc;i++) scanf("%d",&pw[i]);
	int s1,s2;
	for(int i=1;i<nc;i++)
	{
		scanf("%d%d",&s1,&s2);
		ADD(s1,s2);
	}
	CL();
	cout<<ans<<endl;
	return 0;
}