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

  

BZOJ 1601: [Usaco2008 Oct]灌水 最小生成树_超级源点的更多相关文章

  1. BZOJ 1601 [Usaco2008 Oct]灌水 (最小生成树)

    题意 Farmer John已经决定把水灌到他的n(1<=n<=300)块农田,农田被数字1到n标记.把一块土地进行灌水有两种方法,从其他农田饮水,或者这块土地建造水库. 建造一个水库需要 ...

  2. BZOJ 1601 [Usaco2008 Oct]灌水

    1601: [Usaco2008 Oct]灌水 Time Limit: 5 Sec  Memory Limit: 162 MB Description Farmer John已经决定把水灌到他的n(1 ...

  3. BZOJ 1601 [Usaco2008 Oct]灌水:最小生成树

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1601 题意: Farmer John已经决定把水灌到他的n(1<=n<=300 ...

  4. BZOJ——1601: [Usaco2008 Oct]灌水

    http://www.lydsy.com/JudgeOnline/problem.php?id=1601 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit:  ...

  5. bzoj 1601: [Usaco2008 Oct]灌水【最小生成树】

    挺有意思的思路 如果不能自己打井,那么就是MST裸题了,考虑转换一下,自己打井就相当于连接一口虚拟的井(地下水?),所有井i到这口井的距离是w[i],这样把所有边排个序跑MST即可 #include& ...

  6. BZOJ 1601 [Usaco2008 Oct]灌水 (建图+mst)

    题意: 300个坑,每个坑能从别的坑引水,或者自己出水,i从j饮水有个代价,每个坑自己饮水也有代价,问让所有坑都有谁的最少代价 思路: 先建一个n的完全图,然后建一个超级汇点,对每个点连w[i],跑m ...

  7. BZOJ 1601: [Usaco2008 Oct]灌水( MST )

    MST , kruskal 直接跑 ---------------------------------------------------------------------- #include< ...

  8. Kruskal || BZOJ 1601: [Usaco2008 Oct]灌水 || Luogu P1550 [USACO08OCT]打井Watering Hole

    题面:P1550 [USACO08OCT]打井Watering Hole 题解:无 代码: #include<cstdio> #include<cstring> #includ ...

  9. 1601: [Usaco2008 Oct]灌水

    1601: [Usaco2008 Oct]灌水 Time Limit: 5 Sec  Memory Limit: 162 MB Submit: 1342  Solved: 881 [Submit][S ...

随机推荐

  1. 基于SSH的J2EE Web系统配置文件

    1. web.xml 关于Servlet Servlet是一个特殊的Java类,Servlet可以输出HTML标签作为表现层使用,但自从MVC规范出来以后,明确了Servlet的指责仅作为控制器使用, ...

  2. windowsclient开发--为你clientsign一个签名证书

    郑重声明:该方法自娱自乐,尽管写入了签名,可是在微软系统免签证书不是合格的. 什么是签名? 话不多说,上图(没图说个xx): 微信windowsclient.exe安装文件: 再看还有一个.exe文件 ...

  3. HDU 2296

    很明显的DP状态了,设dp[i][j],设当前在状态点i,经过j步能得到的最大分值.也是从root直接扩展就可以了. 至于字符串,实在有点困难,开始想着记录路径,但后来发现路径从后往前回溯不一定是字典 ...

  4. Powershell 渗透测试工具-Nishang

    Powershell 渗透测试工具-Nishang 分享到: 作者:V1ct0r 稿费:500RMB(不服你也来投稿啊!) 投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿 传送门 ...

  5. 我的spark python 决策树实例

    from numpy import array from pyspark.mllib.regression import LabeledPoint from pyspark.mllib.tree im ...

  6. NAS与SAN有什么区别?

    NAS和SAN字面上相似,并且都是新型数据存储模式,但这二者是完全不同的,针对不同方向的技术,为了能够更好的区分它们,天伟数据恢复整理了以下内容供读者参考(天伟数据恢复建议重要数据多备份,备份很重要以 ...

  7. FastDFS介绍(非原创)

    文章大纲 一.FastDFS介绍二.FastDFS安装与启动(Linux系统)三.Java客户端上传图片四.参考文章   一.FastDFS介绍 1. 什么是FastDFS FastDFS是用C语言编 ...

  8. 28. Implement strStr()[E]实现strStr()

    题目 Implement strStr(). Return the index of the first occurrence of needle in haystack, or -1 if need ...

  9. BPM中字段查重,C#Ajac调用示例

    BPM中字段查重记录: 这也算是一个C#调用Ajax的示例吧,如果是异步加载的话async: false去掉就可以了. 需求:比如现在要录入一些信息,但是,有一个字段不能重复,BPM表都是自己生成的, ...

  10. cloudfoundry service broker 制作

    实验室这边需要制作service broker.从今天开始将精力投入其中.