• BZOJ——1601: [Usaco2008 Oct]灌水


    http://www.lydsy.com/JudgeOnline/problem.php?id=1601

    Time Limit: 5 Sec  Memory Limit: 162 MB
    Submit: 2156  Solved: 1416
    [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

    HINT

     

    Source

    资格赛

     1 #include <algorithm>
     2 #include <cstdio>
     3 
     4 #define min(a,b) (a<b?a:b)
     5 
     6 inline void read(int &x)
     7 {
     8     x=0; register char ch=getchar();
     9     for(; ch>'9'||ch<'0'; ) ch=getchar();
    10     for(; ch>='0'&&ch<='9'; ch=getchar()) x=x*10+ch-'0';
    11 }
    12 
    13 const int N(323);
    14 
    15 int n,m,dis[N][N];
    16 
    17 struct Road {
    18     int u,v,w;
    19     Road(int u=0,int v=0,int w=0):u(u),v(v),w(w){;}
    20     bool operator < (const Road&x) const { return w<x.w; }
    21 }road[N*N];
    22 
    23 int fa[N];
    24 int find(int x) { return x==fa[x]?x:fa[x]=find(fa[x]); }
    25 
    26 int Presist()
    27 {
    28     read(n);
    29     
    30     for(int i=1; i<=n; ++i) read(dis[0][i]);
    31     for(int x,i=1; i<=n; ++i)
    32       for(int j=1; j<=n; ++j)
    33         read(x),dis[i][j]=(i!=j)?x:dis[i][j];
    34     for(int i=0; i<=n; ++i)
    35       for(int j=1; j<=n; ++j)
    36         if(i!=j) road[++m]=Road(i,j,dis[i][j]);
    37     for(int i=0; i<=n; ++i) fa[i]=i;
    38     std:: sort(road+1,road+m+1);
    39     int cnt=0,ans=0;
    40     for(int fx,fy,i=1; i<=m; ++i)
    41     {
    42         fx=find(road[i].u),
    43         fy=find(road[i].v);
    44         if(fx==fy) continue;
    45         fa[fx]=fy; ans+=road[i].w;
    46         if(++cnt==n) break;
    47     }
    48     printf("%d
    ",ans);
    49     return 0;
    50 }
    51 
    52 int Aptal=Presist();
    53 int main(int argc,char**argv){;}
  • 相关阅读:
    从头认识java-2.6 逗号操作符
    JavaScript基础知识
    特性选择器
    文本缩进
    如何使图片与导航栏对齐
    如何使用CSS选择器应用于子元素
    图像
    布局
    列表,表格和表单
    盒子
  • 原文地址:https://www.cnblogs.com/Shy-key/p/7892249.html
Copyright © 2020-2023  润新知