zoukankan      html  css  js  c++  java
  • [BZOJ1601][Usaco2008 Oct]灌水 最小生成树水题

    1601: [Usaco2008 Oct]灌水

    Time Limit: 5 Sec  Memory Limit: 162 MB
    Submit: 2121  Solved: 1393
    [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<iostream>
     2 #include<cstring>
     3 #include<cstdio>
     4 #include<cstdlib>
     5 #include<cmath>
     6 #include<algorithm>
     7 using namespace std;
     8 int read() {
     9     int x=0;char ch=getchar();
    10     while(!isdigit(ch)) {ch=getchar();}
    11     while(isdigit(ch)){x=x*10+ch-'0';ch=getchar();}
    12     return x;
    13 }
    14 int n;
    15 int w[500];
    16 struct data {
    17     int u,v,c;
    18     bool operator <(const data tmp) const {
    19         return c<tmp.c;
    20     }
    21 }e[100001];
    22 int cnt;
    23 void add(int u,int v,int c){e[++cnt].u=u;e[cnt].v=v;e[cnt].c=c;}
    24 int fa[1005];
    25 int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);}
    26 int main() {
    27     n=read();
    28     for(int i=1;i<=n;i++) {
    29         int t=read();
    30         add(0,i,t);
    31     }
    32     for(int i=1;i<=n;i++) {
    33         for(int j=1;j<=n;j++) {
    34             int t=read();
    35             add(i,j,t);
    36         }
    37     }
    38     sort(e+1,e+cnt+1);
    39     int sum=0;
    40     int ans=0;
    41     for(int i=0;i<=n;i++) fa[i]=i;
    42     for(int i=1;i<=cnt;i++) {
    43         int f1=find(e[i].u),f2=find(e[i].v);
    44         if(f1!=f2) {
    45             fa[f1]=f2;
    46             ans+=e[i].c;
    47             sum++;
    48         }
    49         if(sum==n) break;
    50     }
    51     printf("%d",ans);
    52 }
    View Code
    O(∩_∩)O~ (*^__^*) 嘻嘻…… O(∩_∩)O哈哈~
  • 相关阅读:
    Excel公式进阶教程
    Excel公式初级教程
    一阶常系数线性差分方程通解求法
    博客园为代码块添加复制功能
    MFC分割窗口(CSplitterWnd)与选项卡视图(CTabView)的混合使用
    自制软件改变窗口大小
    conda的基本使用
    安装GPU驱动
    更换conda源、安装pytorch
    服务器安装anaconda
  • 原文地址:https://www.cnblogs.com/wls001/p/7754001.html
Copyright © 2011-2022 走看看