zoukankan      html  css  js  c++  java
  • [BZOJ1601][Usaco2008 Oct]灌水

    1601: [Usaco2008 Oct]灌水

    Time Limit: 5 Sec  Memory Limit: 162 MB
    Submit: 2009  Solved: 1320
    [Submit][Status][Discuss]

    Description

    Farmer John已经决定把水灌到他的n(1<=n<=300)块农田,农田被数字1到n标记。把一块土地进行灌水有两种方法,从其他农田饮水,或者这块土地建造水库。 建造一个水库需要花费wi(1<=wi<=100000),连接两块土地需要花费Pij(1<=pij<=100000,pij=pji,pii=0). 计算Farmer John所需的最少代价。

    Input

    *第一行:一个数n

    *第二行到第n+1行:第i+1行含有一个数wi

    *第n+2行到第2n+1行:第n+1+i行有n个被空格分开的数,第j个数代表pij。

    Output

    *第一行:一个单独的数代表最小代价.

    Sample Input

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

    Sample Output

    9


    输出详解:

    Farmer John在第四块土地上建立水库,然后把其他的都连向那一个,这样就要花费3+2+2+2=9
     
    新建一个点,向农田$i$连一条权值为$w_i$的无向边
    农田$i,j$之间连一条权值为$p_{i,j}$的无向边
    求出最小生成树即可
    #include <cstdio>
    #include <algorithm>
    using namespace std;
    const int maxn = 300 + 10, maxm = 50000, INF = 1 << 30;
    struct Edge{
        int u, v, w;
        Edge(){}
        Edge(int _u, int _v, int _w): u(_u), v(_v), w(_w){}
        bool operator < (const Edge &x) const {
            return w < x.w;
        }
    }e[maxm];
    int cnt = 0;
    int fa[maxn];
    int Find(int x){
        return x == fa[x] ? x : fa[x] = Find(fa[x]);
    }
    int main(){
        int n;
        scanf("%d", &n);
        for(int w, i = 1; i <= n; i++){
            scanf("%d", &w);
            e[++cnt] = Edge(n + 1, i, w);
        }
        for(int w, i = 1; i <= n; i++)
            for(int j = 1; j <= n; j++){
                scanf("%d", &w);
                if(i > j) e[++cnt] = Edge(i, j, w);
            }
        sort(e + 1, e + cnt + 1);
        n++;
        for(int i = 1; i <= n; i++) fa[i] = i;
        int ans = 0;
        for(int i = 1, k = 0; i <= cnt && k < n - 1; i++){
            if(Find(e[i].u) == Find(e[i].v)) continue;
            ans += e[i].w;
            k++;
            fa[Find(e[i].u)] = Find(e[i].v);
        }
        printf("%d
    ", ans);
        return 0;
    }
  • 相关阅读:
    javascript获取时间差
    鼠标上下滚动支持combobox选中
    用 CSS 实现元素垂直居中,有哪些好的方案?
    easyui form load 数据表单有下拉框
    Javascript 严格模式详解
    artTemplate 原生 js 模板语法版
    artTemplate 简洁语法版
    mysql 选择性高
    mysql 事件调度器
    Windows 抓取本地环路包
  • 原文地址:https://www.cnblogs.com/ruoruoruo/p/7468084.html
Copyright © 2011-2022 走看看