zoukankan      html  css  js  c++  java
  • [Usaco2010 Mar]gather 奶牛大集会

    1827: [Usaco2010 Mar]gather 奶牛大集会

    Time Limit: 1 Sec  Memory Limit: 64 MB Submit: 1129  Solved: 525 [Submit][Status][Discuss]

    Description

    Bessie正在计划一年一度的奶牛大集会,来自全国各地的奶牛将来参加这一次集会。当然,她会选择最方便的地点来举办这次集会。每个奶牛居住在 N(1<=N<=100,000) 个农场中的一个,这些农场由N-1条道路连接,并且从任意一个农场都能够到达另外一个农场。道路i连接农场A_i和B_i(1 <= A_i <=N; 1 <= B_i <= N),长度为L_i(1 <= L_i <= 1,000)。集会可以在N个农场中的任意一个举行。另外,每个牛棚中居住者C_i(0 <= C_i <= 1,000)只奶牛。在选择集会的地点的时候,Bessie希望最大化方便的程度(也就是最小化不方便程度)。比如选择第X个农场作为集会地点,它的不方便程度是其它牛棚中每只奶牛去参加集会所走的路程之和,(比如,农场i到达农场X的距离是20,那么总路程就是C_i*20)。帮助Bessie找出最方便的地点来举行大集会。 考虑一个由五个农场组成的国家,分别由长度各异的道路连接起来。在所有农场中,3号和4号没有奶牛居住。

    Input

    第一行:一个整数N * 第二到N+1行:第i+1行有一个整数C_i * 第N+2行到2*N行,第i+N+1行为3个整数:A_i,B_i和L_i。

    Output

    * 第一行:一个值,表示最小的不方便值。

    Sample Input

    5
    1
    1
    0
    0
    2
    1 3 1
    2 3 2
    3 4 3
    4 5 3

    Sample Output

    15
    先把子树上所有点移动到根的值计算出来,把移动到1的值设为初始答案,发现如果一个孩子如果更优,那么一定满足$2*siz>tot$,显然只可能有一个孩子满足,那就贪心地移动即可
    #include <cstdio>
    char buf[10000000], *ptr = buf - 1;
    inline int readint(){
        int n = 0;
        char ch = *++ptr;
        while(ch < '0' || ch > '9') ch = *++ptr;
        while(ch <= '9' && ch >= '0'){
            n = (n << 1) + (n << 3) + ch - '0';
            ch = *++ptr;
        }
        return n;
    }
    typedef long long ll;
    const int maxn = 100000 + 10;
    struct Edge{
        int to, val, next;
        Edge(){}
        Edge(int _t, int _v, int _n): to(_t), val(_v), next(_n){}
    }e[maxn * 2];
    int fir[maxn] = {0}, cnt = 0;
    inline void ins(int u, int v, int w){
        e[++cnt] = Edge(v, w, fir[u]); fir[u] = cnt;
        e[++cnt] = Edge(u, w, fir[v]); fir[v] = cnt;
    }
    int c[maxn];
    ll f[maxn], siz[maxn], ans;
    void dfs1(int u, int fa){
        f[u] = 0;
        siz[u] = c[u];
        for(int v, i = fir[u]; i; i = e[i].next){
            v = e[i].to;
            if(v == fa) continue;
            dfs1(v, u);
            f[u] += f[v] + siz[v] * e[i].val;
            siz[u] += siz[v];
        }
    }
    void dfs2(int u, int fa){
        for(int v, i = fir[u]; i; i = e[i].next){
            v = e[i].to;
            if(v == fa) continue;
            if(siz[1] - 2 * siz[v] < 0){
                ans += (siz[1] - 2 * siz[v]) * e[i].val;
                dfs2(v, u);
            }
        }
    }
    int main(){
        fread(buf, sizeof(char), sizeof(buf), stdin);
        int N = readint();
        for(int i = 1; i <= N; i++) c[i] = readint();
        for(int u, v, w, i = 1; i < N; i++){
            u = readint();
            v = readint();
            w = readint();
            ins(u, v, w);
        }
        dfs1(1, 0);
        ans = f[1];
        dfs2(1, 0);
        printf("%lld
    ", ans);
        return 0;
    }
  • 相关阅读:
    静态全局变量
    java处理相对路劲
    Java 获取字符串中第N次出现的字符位置
    java 更改list 某一元素?
    for循环,如何结束多层for循环
    SQL Server Management Studio的对象资源管理器的使用
    线程
    存储过程,稍微复杂
    触发器--里面涉及触发器调存储过程
    Bootstrap:弹出框和提示框效果以及代码展示
  • 原文地址:https://www.cnblogs.com/ruoruoruo/p/7512378.html
Copyright © 2011-2022 走看看