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.我们用交换的方法把他排 ...
随机推荐
- mysql——单表查询——聚合函数——示例
), km ), cj ) ); select * from score; ,); ,); ,); ,); ,); ,); ,); ,); ,); ,); ,); ,); ; 查询此同学的总成绩: ; ...
- Win10无法安装.net framework 3.5出错提示无法安装以下功能该怎么办?
在Windows操作系统中,.NET Framewor对今天应用程序的成功提供了的安全解决方案,它能强化两个安全模型间的平衡.在提供对资源的访问,以便以完成有用的工作,对应用程序的安全性作细致的控制以 ...
- python 并发编程 多线程 守护线程
做完工作这个进程就应该被销毁 单线程情况: 一个进程 ,默认有一个主线程 ,这个主线程执行完代码后 ,就应该自动销毁.然后进程也销毁. 多线程情况: 主线程代表进程结束 一个进程可以开多个线程,默认开 ...
- Java最新学习线路(基础,源码,项目,实战)
如需获取以下学习资源请关注公众号:Java编程指南 我们为自学者编程的或初学java的小伙伴们准备了一整套完整的学习资源和文章,还有我自己在自学路上的一些总结和学习线路,希望能帮到小伙伴们,如果有什么 ...
- Luogu P3195 [HNOI2008]玩具装箱
题目 预处理\(C\)的前缀和\(sum\).设前\(i\)个物品的最小答案为\(f\). \(f_i=\max\limits_{j\in[1,i)}(f_j+(sum_i-sum_j-L)^2)\) ...
- Packet flow in l2(receive and transmit)
Receive 1. napi && none napi 讲网络收报过程,必然要涉及到网卡收报模型发展历史.总体上看,网络收报过经历了如下发展过程: 轮询 ---à 中断 ---à ...
- oracle中的多表查询和子查询以及一些注意事项
多表查询就是使用两张表及其以上的查询.首先需要知道几个名词,笛卡尔积,内连接,外连接,子查询. 1)笛卡尔积 所谓笛卡尔积其实就是两张表数据的条数相乘得到的最后结果,例如表1有10条数据,表2有4条数 ...
- vue项目1-pizza点餐系统1-利用bootstrap4制作导航栏
初次接触Bootstrap,简单谈一下理解.bootstrap是一个简单有强悍的前端框架,它是一个开源项目.当我们需要一些样式等,可以了解bootstrap的相关class.标签名称等所代表的意思,然 ...
- C++质因数分解
// CPP.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include<cs ...
- Uva 10054 欧拉回路 打印路径
看是否有欧拉回路 有的话打印路径 欧拉回路存在的条件: 如果是有向图的话 1.底图必须是连通图 2.最多有两个点的入度不等于出度 且一个点的入度=出度+1 一个点的入度=出度-1 如果是无向图的话 1 ...