zoukankan      html  css  js  c++  java
  • BZOJ 1601: [Usaco2008 Oct]灌水 最小生成树_超级源点

    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

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

    题解:

    最小生成树,模型挺巧妙的. 

    设立超级源点 $S$. 

    对于每个点 $u$, 建立 $<S,u>$ 的边,边权为 $val_{u}$ ,代表该点要自己单独建立水库.
    其次,再向图中与该点相连的边练边,边权按照输入来存.
    跑一遍最小生成树即可.
    这样就满足了图是联通的,每个点贡献可能是由超级源点给的,也可能是由其他点给的.
     

    Code:

    #include <bits/stdc++.h>
    #define maxn 2000000 
    #define setIO(s) freopen(s".in","r",stdin) 
    using namespace std;              
    int A[maxn],u[maxn],v[maxn],val[maxn],cnt,w[maxn]; 
    int cmp(int a,int b){ return val[a]<val[b];  }
    struct U{
        int p[maxn]; 
        void init(){  for(int i=0;i<maxn;++i) p[i]=i;  }
        int find(int x){ return p[x]==x?x:p[x]=find(p[x]); }
        void merge(int a,int b){
            int x=find(a),y=find(b); 
            if(x==y) return;
            p[x]=y; 
        }
    }tree; 
    int main(){
        // setIO("input"); 
        tree.init(); 
        int n; 
        scanf("%d",&n); 
        for(int i=1;i<=n;++i) ++cnt,scanf("%d",&val[cnt]),u[cnt]=0,v[cnt]=i;  
        for(int i=1;i<=n;++i)
            for(int j=1,a;j<=n;++j) {
                scanf("%d",&a); 
                if(i!=j) ++cnt,u[cnt]=i,v[cnt]=j,val[cnt]=a; 
            }
        for(int i=1;i<=cnt;++i) A[i]=i; 
        sort(A+1,A+1+cnt,cmp); 
        int ans=0;
        for(int i=1;i<=cnt;++i) {
            int cur=A[i]; 
            int a=u[cur],b=v[cur]; 
            if(tree.find(a)!=tree.find(b)){
                ans+=val[cur]; 
                tree.merge(a,b); 
            } 
        }
        printf("%d",ans); 
        return 0; 
    }
    

      

  • 相关阅读:
    《OD大数据实战》HDFS入门实例
    Python-操作Excel
    python操作word
    pandas操作Excel
    pyqt5-表格TableWidGet
    pyqt5-动画组QAnimationGroup
    pyqt5--动画
    pyqt5-QTDesigner--UI文件的使用方式
    pyqt5-QTDesigner--控件操作
    nodejs中cookie、session的使用
  • 原文地址:https://www.cnblogs.com/guangheli/p/10944106.html
Copyright © 2011-2022 走看看