比赛 |
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;
}