题意:给出一个有n个顶点的树,并给树上1~k种颜色(k<n-1),求边的权值(每种颜色的边连接的节点的权值相加,两边相邻中间节点相加两次,一个节点可多次被相加)
思路:对于没添加一种颜色都会出现一个相邻的而颜色不同的边,相当与多加了一个节点的权值,且该节点的度必须大于1,所以只要求出度不为一的节点的权值排序即可得到答案
AC代码:
package 练习;
import java.io.*;
import java.lang.*;
import java.util.*;
import sun.net.www.content.audio.basic;
import java.io.*;
import java.util.*;
public class Main{
static Scanner scanner=new Scanner(System.in);
public static void main(String[] args) {
int t=scanner.nextInt();
while(t-->0) {
StringBuilder sb=new StringBuilder();
int n=scanner.nextInt();
int a[]=new int [n];
long s=0;
for(int i=0;i<n;i++) {
a[i]=scanner.nextInt();
s+=a[i];
}
PriorityQueue<Integer>pq=new PriorityQueue<Integer>(Collections.reverseOrder());
boolean b[]=new boolean[n];
for(int i=0;i<n-1;i++) {
int x=scanner.nextInt()-1;
int y=scanner.nextInt()-1;
if(b[x])pq.add(a[x]);
if(b[y])pq.add(a[y]);
b[x]=true;
b[y]=true;
}
sb.append(s);
for(int i=0;i<n-2;i++) {
int x=pq.poll();
s+=x;
sb.append(" "+s);
}
System.out.println(sb);
}
}
}