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

    Time Limit: 5 Sec  Memory Limit: 162 MB
    Submit: 1915  Solved: 1253

    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

    HINT

     

    Source

    点了道水题玩儿

    最小生成树

    新建一个点表示建水库,把“自己建一个水库”等价成连一条到新点的边。

    变成裸的生成树题了。

     1 /*by SilverN*/
     2 #include<iostream>
     3 #include<algorithm>
     4 #include<cstring>
     5 #include<cstdio>
     6 #include<cmath>
     7 #include<vector>
     8 using namespace std;
     9 const int mxn=100010;
    10 int read(){
    11     int x=0,f=1;char ch=getchar();
    12     while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    13     while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();}
    14     return x*f;
    15 }
    16 struct edge{
    17     int x,y,v;
    18     bool operator < (const edge &b)const{
    19         return v<b.v;
    20     }
    21 }e[mxn<<1];
    22 int mct=0;
    23 int T;
    24 int fa[mxn];
    25 int find(int x){
    26     return fa[x]==x?x:fa[x]=find(fa[x]);
    27 }
    28 int n;
    29 int ans=0,cnt=1;
    30 void kruskal(){
    31     for(int i=1;i<=n;i++)fa[i]=i;
    32     for(int i=1;i<=mct && cnt<n;i++){
    33         int x=e[i].x,y=e[i].y;
    34         x=find(x);y=find(y);
    35         if(x!=y){
    36             fa[x]=y;
    37             ans+=e[i].v;
    38             ++cnt;
    39         }
    40     }
    41     return;
    42 }
    43 int main(){
    44     int i,j,x,y,w;
    45     n=read()+1;
    46     for(i=1;i<n;i++){
    47         w=read();
    48         e[++mct]=(edge){i,n,w};
    49     }
    50     for(i=1;i<n;i++)
    51         for(j=1;j<n;j++){
    52             w=read();
    53             e[++mct]=(edge){i,j,w};
    54         }
    55     sort(e+1,e+mct+1);
    56     kruskal();
    57     printf("%d
    ",ans);
    58     return 0;
    59 }
  • 相关阅读:
    Allegro PCB Design GXL (legacy) 使用slide无法将走线推挤到焊盘的原因
    OrCAD Capture CIS 16.6 导出BOM
    Altium Designer (17.0) 打印输出指定的层
    Allegro PCB Design GXL (legacy) 将指定的层导出为DXF
    Allegro PCB Design GXL (legacy) 设置十字大光标
    Allegro PCB Design GXL (legacy) 手动更改元器件引脚的网络
    magento产品导入时需要注意的事项
    magento url rewrite
    验证台湾同胞身份证信息
    IE8对css文件的限制
  • 原文地址:https://www.cnblogs.com/SilverNebula/p/6776360.html
Copyright © 2011-2022 走看看