185. [USACO Oct08] 挖水井(点击转到COGS)

输入文件:water.in   输出文件:water.out  
时间限制:1 s   内存限制:128 MB

描述

农夫约翰决定给他的N(1<=N<=300)个牧场浇水,这些牧场被自然的命名为1..N。他可以给一个牧场引入水通过在这个牧场挖一口井或者修一条管道使这个牧场和一个已经有水的牧场连接。

在牧场i挖一口井的花费是w_i(1<=w_i<=100000)。修建一条水管连接牧场i和牧场j的花费是p_ij(1<=p_ij<=100000;p_ij=p_ji;p_ii=0)。

请确定农夫约翰为了完成浇灌所有的牧场所需的最小的总花费。

题目名称:water

输入格式:

第1行:一个单独的整数n。

第2..n+1行:第i+1行包含一个单独的整数w_i。

第n+2..2n+1行:第n+1+i行包含n个用空可分开的整数;其中第j个数是p_ij。

输入样例(file water.in):

4

5

4

4

3

0 2 2 2

2 0 3 3

2 3 0 4

2 3 4 0

输入说明:

这里有4个牧场,修井和修管道的代价如图。

输出格式:

•     第1行:一个单独的整数,表示花费。

输出样例(file water.out):

9

输出说明:

农夫约翰可以在第4个牧场修井,并且将每个牧场和第一个连接起来,这样,花费是3+2+2+2=9。

思路:

将挖水井看成边(连向自己的),利用并查集,求出各最小生成树

 #include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 123456789
using namespace std;
struct edge
{
int fr,to,w;
}E[];//size > 300*300
int n,x,tot,num;
int w[],father[];
int find(int x)
{
if(father[x]!=x) father[x]=find(father[x]);
return father[x];
}
void unionn(int x,int y)
{
father[x]=y;
}
void add(int x,int y,int z)
{
num++;
E[num].fr=x;
E[num].to=y;
E[num].w=z;
}
bool cmp(const edge &a,const edge &b)
{
return a.w<b.w;
}
int main()
{
freopen("water.in","r",stdin);
freopen("water.out","w",stdout);
scanf("%d",&n);
for(int i=;i<=n;i++)
father[i]=i;
for(int i=;i<=n;i++)
scanf("%d",&w[i]);
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
{
scanf("%d",&x);
if(x)
add(i,j,x);
}
for(int i=;i<=n;i++)
{
add(i,n+,w[i]);//E2:从i向n+1(任一点)挖井的费用(把边存进去)
add(n+,i,w[i]);//E3:从n+1向i挖井的费用 E2的反图
}
sort(E+,E+num+,cmp);
int k=;
for(int i=;i<=num;i++)
{
int r1=find(E[i].fr);
int r2=find(E[i].to);
if(r1!=r2)
{
unionn(r1,r2);
k++;
tot+=E[i].w;
}
if(k==n)//最小生成树的n-1条边+至少一个水井
break;
}
printf("%d",tot);
fclose(stdin);fclose(stdout);
return ;
}

185. [USACO Oct08] 挖水井的更多相关文章

  1. 185.[USACO Oct08] 挖水井 (第三次考试大整理)

    185. [USACO Oct08] 挖水井 输入文件:water.in   输出文件:water.out   简单对比 时间限制:1 s   内存限制:128 MB 农夫约翰决定给他的N(1< ...

  2. 186. [USACO Oct08] 牧场旅行

    186. [USACO Oct08] 牧场旅行(点击转到COGS) 输入文件:pwalk.in   输出文件:pwalk.out 时间限制:1 s   内存限制:128 MB 描述 n个被自然地编号为 ...

  3. cogs 184. [USACO Oct08] 搭建篱笆

    184. [USACO Oct08] 搭建篱笆 ★★   输入文件:quad.in   输出文件:quad.out   简单对比时间限制:1 s   内存限制:128 MB 勤奋的农夫约翰想要修建一个 ...

  4. 186. [USACO Oct08] 牧场旅行 (第三次考试大整理)

    186. [USACO Oct08] 牧场旅行 输入文件:pwalk.in   输出文件:pwalk.out   简单对比 时间限制:1 s   内存限制:128 MB n个被自然地编号为1..n奶牛 ...

  5. cogs 186. [USACO Oct08] 牧场旅行 树链剖分 LCA

    186. [USACO Oct08] 牧场旅行 ★★☆   输入文件:pwalk.in   输出文件:pwalk.out   逐字节对比时间限制:1 s   内存限制:128 MB n个被自然地编号为 ...

  6. 在线倍增法求LCA专题

    1.cojs 186. [USACO Oct08] 牧场旅行 ★★   输入文件:pwalk.in   输出文件:pwalk.out   简单对比时间限制:1 s   内存限制:128 MB n个被自 ...

  7. 控制反转(IOC: Inverse Of Control) & 依赖注入(DI: Independence Inject)

    举例:在每天的日常生活中,我们离不开水,电,气.在城市化之前,我们每家每户需要自己去搞定这些东西:自己挖水井取水,自己点煤油灯照明,自己上山砍柴做饭.而城市化之后,人们从这些琐事中解放了出来,城市中出 ...

  8. hdu 2121 , hdu 4009 无定根最小树形图

    hdu 2121 题目:给出m条有向路,根不确定,求一棵最小的有向生成树. 分析:增加一个虚拟节点,连向n个节点,费用为inf(至少比sigma(cost_edge)大).以该虚拟节点为根求一遍最小树 ...

  9. HDU3311Dig The Wells

    给定N个寺庙,和M个另外的地方. 然后给定点权,表示在这个点挖水井需要的代价. 再给定边权,为建造无向边i,j的代价. 然后求怎样弄最小的代价使得前N个点,就是寺庙都能从挖的井里得到水. 输入输出格式 ...

随机推荐

  1. element-ui中用el-dialog+el-table+el-pagination实现文件默认选中且在分页的条件下有记忆功能

    需求: 点击按钮,出现列表弹框,选择需要的选项确认后显示选中的选项.每次点击按钮,列表中默认显示之前选中的文件. el-table-column,设type属性为selection,实现表格中多行选择 ...

  2. cf1110E 思维

    /* Ci'=Ci+1 + Ci-1 -Ci Ci+1 - Ci' = Ci - Ci-1 Ci' - Ci-1 = Ci+1 - Ci; 即求一次Ci’等价于交换Ci和Ci-1 与 Ci+1和Ci的 ...

  3. re模块(正则)

    一, 什么是正则? 正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法. 在python中,正则内嵌在python中,并通过re模块实现,正则表达模式被编译成一系列 ...

  4. mac 显示/不显示"任何来源"_ mac打开安装文件显示文件破损解决办法

    系统: macOS_10.12 导致文件破损原因: 软件有经过了汉化或者破解,所以可能被Mac认为「已损坏」 解决问题办法: 系统偏好设置 -> 安全性与隐私 -> 通用 -> 选择 ...

  5. truncate table时存在外键约束的解决办法

    以前在使用truncate命令时遇到表存在外键引用时无法执行命令的情况都是用delete来代替,今天又遇到这个问题,于是在网上搜了一把,可以通过如下方式解决: 1.基本思路:先关闭mysql的外键约束 ...

  6. spring cloud Eureka注册中心集群搭建

    1.创建springcloud-eureka maven项目 pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0&quo ...

  7. Scrapy库的安装(windows版)

    这个是需要安装的所有文件 1. wheel pip install wheel 2. lxml http://www.lfd.uci.edu/~gohlke/pythonlibs/#lxml 3. P ...

  8. Update openssh7.9 on centos6

    一.制作RPM安装包1)依赖安装yum install rpm-build gcc make wget openssl-devel krb5-devel pam-devel libX11-devel ...

  9. 网络通信socket连接数上限

    socket accept()返回的socket描述符的端口和listen描述符端口是一样的吗? as you know,一个socket是由一个五元组来唯一标示的,即(协议,server_ip, s ...

  10. ElasticSearch文档及分布式文档存储

    1.什么是文档? 文档由索引(_index),类型(_type),唯一标识(_id) 组成,我们为 _index(索引) 分配相关逻辑地址分片,该索引下的数据会根据索引以及类型计算哈希来分配数据存储的 ...