185.[USACO Oct08] 挖水井 (第三次考试大整理)
185. [USACO Oct08] 挖水井
输入文件: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。
(图片掉了,只好自己想象)
错因:
没有准确的记清楚算法的过程。
思路:
因为现在还不知道到底哪一个是挖通的,所以你需要新建一个“n+1”点,代表这是一个"暂时的水源"。
(一开始我的想法是枚举,但是这样做是行不通的,因为点太多了。)
暂时将这个点与其他的点都“连接”起来,连到这个刚建的“n+1”这个点上,然后再进行松弛。
那么,最终的结果即为最小的花费。
所以说,这道题除了新加了一个点以外,就是一道克鲁斯卡尔裸题!
代码酱=u=:
#include<iostream>
#include<cstdio>
#include<algorithm>
#define maxn 100001 using namespace std; int dad[maxn],n,m,u,v,w,b[maxn],tot,q,k,x; struct Zb{
int x;
int y;
int w;
bool operator < (const Zb &q)const
{
return w < q.w;
}
}a[maxn]; int find(int x){//找父亲
if(x!=dad[x]) dad[x]=find(dad[x]);
return x == dad[x] ? x : find(dad[x]);
} void unionn(int x,int y){//找祖先,合并为同一祖先
int r1=find(x);
int r2=find(y);
if(r1!=r2)
dad[r1]=r2;
} int main()
{
//freopen("water.in","r",stdin);
//freopen("water.out","w",stdout);
cin>>n;
for(int i=;i<=n;i++){
cin>>b[i];
}
for(int i=;i<=n;i++) dad[i]=i;
for(int i=;i<=n;++i)
{
for(int j=;j<=n;++j){
cin>>x;
if(x!=){//将x所代表的连通的点记录下来
m++;//记录有几个点是连通的
a[m].x=i,a[m].y=j,a[m].w=x;
}
}
}
for(int i=;i<=n;i++)//将需要挖井的费用加入
{
m++;
a[m].x=i;
a[m].y=n+;
a[m].w=b[i];
m++;
a[m].x=n+;
a[m].y=i;
a[m].w=b[i];
}
sort(a+,a+m+);//将树从小到大排序
k=;
for(int i=;i<=m;i++){
int r1=find(a[i].x);
int r2=find(a[i].y);
if(r1!=r2)
{
dad[r1]=r2;
tot+=a[i].w;//统计下总费用
k++;
}
if(k==n) break;//当找完所有点
}
cout<<tot<<endl;
//fclose(stdin);
//fclose(stdout);
return ;
}
185.[USACO Oct08] 挖水井 (第三次考试大整理)的更多相关文章
- 186. [USACO Oct08] 牧场旅行 (第三次考试大整理)
186. [USACO Oct08] 牧场旅行 输入文件:pwalk.in 输出文件:pwalk.out 简单对比 时间限制:1 s 内存限制:128 MB n个被自然地编号为1..n奶牛 ...
- 185. [USACO Oct08] 挖水井
185. [USACO Oct08] 挖水井(点击转到COGS) 输入文件:water.in 输出文件:water.out 时间限制:1 s 内存限制:128 MB 描述 农夫约翰决定给他 ...
- 157. [USACO Nov07] 奶牛跨栏(第三次考试大整理)
157. [USACO Nov07] 奶牛跨栏 输入文件:hurdles.in 输出文件:hurdles.out 简单对比 时间限制:1 s 内存限制:128 MB 译 by CmYkRg ...
- [NOIP2012] 同余方程(第三次考试大整理)
1265. [NOIP2012] 同余方程 输入文件:mod.in 输出文件:mod.out 简单对比 时间限制:1 s 内存限制:128 MB [题目描述] 求关于 x 的同余方程 ax ...
- 186. [USACO Oct08] 牧场旅行
186. [USACO Oct08] 牧场旅行(点击转到COGS) 输入文件:pwalk.in 输出文件:pwalk.out 时间限制:1 s 内存限制:128 MB 描述 n个被自然地编号为 ...
- cogs 184. [USACO Oct08] 搭建篱笆
184. [USACO Oct08] 搭建篱笆 ★★ 输入文件:quad.in 输出文件:quad.out 简单对比时间限制:1 s 内存限制:128 MB 勤奋的农夫约翰想要修建一个 ...
- cogs 186. [USACO Oct08] 牧场旅行 树链剖分 LCA
186. [USACO Oct08] 牧场旅行 ★★☆ 输入文件:pwalk.in 输出文件:pwalk.out 逐字节对比时间限制:1 s 内存限制:128 MB n个被自然地编号为 ...
- 任正非:华为三十年大限快到了 想不死就得新生(建立战略预备队)cool
华为心声社区官方微信今日发布了任正非8月15日在华为公司内部做的关于战略预备队建设汇报的讲话.讲话内容中提到,华为公司需要组织.结构.人才等所有一切都变化,通过变化使新的东西成长起来. 任正非表示 ...
- 【USACO 2.1.3】三值的排序
[题目描述] 排序是一种很频繁的计算任务.现在考虑最多只有三值的排序问题.一个实际的例子是,当我们给某项竞赛的优胜者按金银铜牌排序的时候.在这个任务中可能的值只有三种1,2和3.我们用交换的方法把他排 ...
随机推荐
- scrapy 正则汉字的提取方法
[\u4E00-\u9FA5]
- Spring(六)--Spring配置文件之间的关系
Spring配置文件之间的关系 1.需要的实体类 2.需要的xml文件 3.测试类 未完待续!!!
- 分库分表之后全局id咋生成?
1.面试题 分库分表之后,id主键如何处理? 2.面试官心里分析 其实这是分库分表之后你必然要面对的一个问题,就是id咋生成?因为要是分成多个表之后,每个表都是从1开始累加,那肯定不对啊,需要一个全局 ...
- Ubuntu 19.04
Ubuntu 19.04自动挂载机械盘 创建要挂载的文件夹 sudo mkdir /home/soldier/SOLDIER 获取UUID sudo blkid 分区的TYPE是“ntfs” 编辑/e ...
- 关于c++对拍的办法
众所周知,在\(oi\)学习以及考试中,对拍是一件非常重要的事. 有了对拍后,我们可以利用它发现代码上的一些非常难看出来的错误. 编写对拍程序一般有两个办法. 方案一 编写一个对拍的\(cpp\),并 ...
- 初探CSS - 5 创建
CSS 创建 当读到一个样式表时,浏览器会根据它来格式化 HTML 文档. 如何插入样式表 插入样式表的方法有三种: 外部样式表(External style sheet) 内部样式表(Interna ...
- HashMap 的实现原理(1.8)
详见:https://blog.csdn.net/richard_jason/article/details/53887222 HashMap概述 1.初始容量默认为16 最大为2的30次方,负载因子 ...
- 深入理解Java的反射机制
https://blog.csdn.net/u012585964/article/details/52011138 http://www.importnew.com/20339.html 一,java ...
- 常用命令之------tcpdump
语法: tcpdump [options] [not] proto dir type 案例 tcpdump -i eth0 host 192.168.1.1 and icmp -n -w /tmp/t ...
- 基本运算符与if while详解:
''' 基本运算符与if while详解: ''' # 算术运算符 # + - * / % // ** # 返回一个数值 # 比较运算符 # > >= < <= == != # ...