• 给树染色


     

     1 #include <bits/stdc++.h>
     2 using namespace  std;
     3 const int N = 1010;
     4 int n, root;
     5 struct Node {
     6     int p, s, v;
     7     double avg;
     8     //p是该节点的父节点
     9     //s是该节点包含的点的数量
    10     //v是该节点的权值
    11     //avg是该节点的平均数
    12 } nodes[N];
    13 int find() {
    14     double avg = 0;
    15     int res = -1;
    16     for (int i = 1; i <= n; i++) {
    17         if (i != root && nodes[i].avg > avg) {
    18             avg = nodes[i].avg;
    19             res = i;
    20         }
    21     }
    22     return res;
    23 }
    24 int main() {
    25     cin >> n >> root;
    26     int ans = 0;
    27     for (int i = 1; i <= n; i++) {
    28         cin >> nodes[i].v;
    29         nodes[i].avg = nodes[i].v;
    30         nodes[i].s = 1;
    31         ans += nodes[i].v; //初始化 
    32     }
    33     for (int i = 0; i < n - 1; i++) {
    34         int a, b;
    35         cin >> a >> b;
    36         nodes[b].p = a;
    37     }
    38     for (int i = 0; i < n - 1; i++) {
    39         int p = find(); //找权值最大的节点
    40         int father = nodes[p].p; //它的父亲
    41         ans += nodes[p].v * nodes[father].s;
    42         nodes[p].avg = -2; //删除该点
    43         for (int j = 1; j <= n; j++) { //合并节点
    44             if (nodes[j].p == p) {
    45                 nodes[j].p = father;
    46             }
    47         }
    48         //修改father信息
    49         nodes[father].v += nodes[p].v;
    50         nodes[father].s += nodes[p].s;
    51         nodes[father].avg = (double)nodes[father].v / nodes[father].s;
    52     }
    53     cout << ans << endl;
    54     return 0;
    55 }
  • 相关阅读:
    python之socket编程
    python之异常处理
    面向对象进阶
    openstack的网络配置
    VLAN,GRE,VXLAN
    三节点搭建openstack-Mitaka版本
    矩阵转换
    判断区域相交的方法
    Centos 6.5 Multipath 初始配置
    CentOS开机自动运行程序的脚本
  • 原文地址:https://www.cnblogs.com/fx1998/p/13985053.html
Copyright © 2020-2023  润新知