BZOJ 1601: [Usaco2008 Oct]灌水 最小生成树_超级源点

BZOJ 1601: [Usaco2008 Oct]灌水 最小生成树_超级源点

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; 
}

  

posted @ 2019-05-29 15:29 EM-LGH 阅读( ...) 评论( ...) 编辑 收藏
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值