P1550打井
这是USACO2008年的一道最小生成树题,感谢dzj老师那天教的图论。
要引渠让每一个村庄都可以接到水,然后从某一个村庄到另一个村庄修剪水道要花费w元,并且还要打井(至少一个)(而输入数据也包括了在每一个村庄打井的费用),需要为使所有农场都与有水的村庄相连或拥有水井所需要的钱数。很明显,这个题只有建成一个联通的图,然后求最小权值和即可。所以我选用了kruskal算法求最小生成树。但是这里还有一个问题,就是怎么判断是打井还是连水道的问题。那么我们则用到了“超级元”的思想,让水井代表0号节点,则边权费用,这样就转化为了克鲁斯卡尔算法的模型。
1.注意将实际问题算法模型化
2.如果有不一样的地方,要进行转化,这里常用超级元来解决
3.注意初始化问题,别乱来,建议用memset,不算慢且全
代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define maxn 5000
#define maxm 200000
using namespace std;
int fa[maxn];
struct edge{
int u,v,w;
}e[maxm];
int n,m;
int u,v;
int ans=;
int tot;
void init(){//初始化
memset(fa,-,sizeof(fa));
}
int getFa(int x){
if(fa[x]==-) return x;
else return fa[x]=getFa(fa[x]);
}
void merge(int x,int y){
fa[x]=y;
}
bool cmp(edge a,edge b){//结构体比较
return a.w<b.w;
}
int cnt=;
int main(){
init();
cin>>n;
for(int i=;i<=n;i++){
int w;
cin>>w;
tot++;
e[tot].u=;
e[tot].v=i;
e[tot].w=w;
}
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
int w;
cin>>w;
tot++;
e[tot].u=i;
e[tot].v=j;
e[tot].w=w;
}
}
sort(e,e+tot+,cmp);//按照权值排序,贪心思想
for(int i=;i<=tot-;i++){
int t1=getFa(e[i].u);
int t2=getFa(e[i].v);
if(t2!=t1){
merge(t1,t2);
ans+=e[i].w;
}
}
cout<<ans;
return ;
}
P1550打井的更多相关文章
- Luogu P1550 打井Watering Hole
P1550 [USACO08OCT]打井Watering Hole 题目背景 John的农场缺水了!!! 题目描述 Farmer John has decided to bring water to ...
- 洛谷P1550打井
打井 题目 该题是一个最小生成树的好题,但是比起一般的最小生成树来说他不仅仅有各个井相连,而且还要和地下水相连,所以地下水我们也可以看成一口井. 代码 #include <bits/stdc++ ...
- Kruskal || BZOJ 1601: [Usaco2008 Oct]灌水 || Luogu P1550 [USACO08OCT]打井Watering Hole
题面:P1550 [USACO08OCT]打井Watering Hole 题解:无 代码: #include<cstdio> #include<cstring> #includ ...
- bzoj1601 / P1550 [USACO08OCT]打井Watering Hole(堆优化prim)
P1550 [USACO08OCT]打井Watering Hole 对于自己建水库的情况,新建一个虚拟结点,和其他点的边权即为自建水库的费用 这样问题就转化为一个裸最小生成树问题了. 这里用堆优化 ...
- 洛谷P1550 [USACO08OCT]打井Watering Hole
P1550 [USACO08OCT]打井Watering Hole 题目背景 John的农场缺水了!!! 题目描述 Farmer John has decided to bring water to ...
- 题解——洛谷P1550 [USACO08OCT]打井Watering Hole(最小生成树,建图)
题面 题目背景 John的农场缺水了!!! 题目描述 Farmer John has decided to bring water to his N (1 <= N <= 300) pas ...
- luogu P1550 [USACO08OCT]打井Watering Hole
题目背景 John的农场缺水了!!! 题目描述 Farmer John has decided to bring water to his N (1 <= N <= 300) pastur ...
- 洛谷 题解 P1550 【[USACO08OCT]打井Watering Hole】
本题看似很难,实际上思路非常简单--如果你想通了. 首先有一个问题:图中有几个点?大部分的人会回答\(n\)个点.错了,有\(n+1\)个. 多出来的那个点在哪?关键在于你要理解每一个决策的意义.实际 ...
- 题解 P1550 【[USACO08OCT]打井Watering Hole】
题面(翻译有点问题,最后一句话) 农民John 决定将水引入到他的n(1<=n<=300)个牧场.他准备通过挖若 干井,并在各块田中修筑水道来连通各块田地以供水.在第i 号田中挖一口井需要 ...
随机推荐
- 51 Nod 1020 逆序排列
1020 逆序排列 基准时间限制:2 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 收藏 关注 在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么 ...
- pyqt5对用qt designer设计的窗体实现弹出子窗口的示例
pyqt5对用qt designer设计的窗体实现弹出子窗口的示例 脚本专栏 python 1. 用qt designer编写主窗体,窗体类型是MainWindow,空白窗口上一个按钮.并转换成mai ...
- Django JWT
概述 如果各位不了解 JWT,不要紧张,它并不可怕. JSON Web Token(JWT)是一个非常轻巧的规范.这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息. 让我们来假想一下一个 ...
- /static/fonts/SIMYOU.TTF’ 字体
/** * pdf 加水印 * * @return */ public byte[] pdfAddWaterMark(byte[] byes) { String fileName = UUID.ran ...
- golang defer 延后执行什么
对于golang的defer,我们已经知道,defer定义的语句可以延后到函数返回时执行. 经常用在文件的关闭,锁的释放等场景中.而且defer定义的语句即使遇到panic也会执行.这样,可以执行必要 ...
- Emacs Python 自动补全之 jedi
jedi jedi 的安装配置并不是很友好.github 上也没有明确说明.查了很多资料, 最后才配置成功.可是效果却不是很理想.在补全的时候有明显的卡顿现象. 不知道网上这么多人对其推崇备至是因为什 ...
- Spring MVC Post请求返回403错误,Get请求却正常,可能是安全框架引起的前端解决办法
原文地址:http://blog.csdn.net/t894690230/article/details/52404105 困惑:很奇怪,明明在方法上面配置了RequestMethod.POST,PO ...
- 【漏洞汇总】SQL 注入漏洞之 mysql
日期:2019-07-23 19:55:59 更新:2019-08-02 10:40:37 作者:Bay0net 介绍:Mysql 注入笔记 0x01. 基本信息 1.1 基本术语 数据库: 数据库是 ...
- SparseLDA算法
2 SparseLDA算法 本章将介绍一种Gibbs Sampling算法的加速算法——SparseLDA [9],它主要利用LDA 模型的稀疏性,来达到加速以及节省内存的目的,是一种精确算法(没有近 ...
- squid 3.5.2配置文件
https://www.cnblogs.com/mchina/p/3812190.html 配置文件就加入下面这几句话: cache_mem 64 MB maximum_object_size 4 M ...