- Quiz
- AC
- 解説
- 公式解説では大きい値から辺に設定し、辺を伸ばしていくdfs
- 逆に、葉から小さいコストのものから設定しても通るよね?と思ったのでやってみた
- 葉に1番小さいコストを設定して葉を消す。葉の親が新たな葉となったら、次のコストを割り当てる候補とする
- 感想
- 辺の削除をするので隣接リストをsetで持った
- 実装は手間がかかった。根からdfsできるならそちらの方がいい
int main(){
cin.tie(0);
ios::sync_with_stdio(false);
ll N;cin>>N;
vector<set<ll>> se(N);
VI deg(N);
rep(i,N-1){
ll a,b;cin>>a>>b;
a--;b--;
deg[a]++;
deg[b]++;
se[a].insert(b);
se[b].insert(a);
}
VI C = loadV(N);
SORT(C);
set<ll> leafs;
rep(i,N){
if(se[i].size()==1)leafs.insert(i);
}
VI Ans(N, -1);
ll idx=0;
while(leafs.size()){
auto it = leafs.begin();
ll leaf = *it;
ll parent = *se[leaf].begin();
Ans[leaf]=C[idx++];
if(idx==N-1){
break;
}
leafs.erase(leaf);
se[parent].erase(leaf);
if(se[parent].size()==1){
leafs.insert(parent);
}
}
rep(i,N){
if(Ans[i]==-1){
Ans[i]=C[idx]; break;
}
}
ll sum = SUM(C)-C.back();
p(sum);
print_vector(Ans);
return 0;
}