这是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打井的更多相关文章

  1. Luogu P1550 打井Watering Hole

    P1550 [USACO08OCT]打井Watering Hole 题目背景 John的农场缺水了!!! 题目描述 Farmer John has decided to bring water to ...

  2. 洛谷P1550打井

    打井 题目 该题是一个最小生成树的好题,但是比起一般的最小生成树来说他不仅仅有各个井相连,而且还要和地下水相连,所以地下水我们也可以看成一口井. 代码 #include <bits/stdc++ ...

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

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

  4. bzoj1601 / P1550 [USACO08OCT]打井Watering Hole(堆优化prim)

    P1550 [USACO08OCT]打井Watering Hole   对于自己建水库的情况,新建一个虚拟结点,和其他点的边权即为自建水库的费用 这样问题就转化为一个裸最小生成树问题了. 这里用堆优化 ...

  5. 洛谷P1550 [USACO08OCT]打井Watering Hole

    P1550 [USACO08OCT]打井Watering Hole 题目背景 John的农场缺水了!!! 题目描述 Farmer John has decided to bring water to ...

  6. 题解——洛谷P1550 [USACO08OCT]打井Watering Hole(最小生成树,建图)

    题面 题目背景 John的农场缺水了!!! 题目描述 Farmer John has decided to bring water to his N (1 <= N <= 300) pas ...

  7. luogu P1550 [USACO08OCT]打井Watering Hole

    题目背景 John的农场缺水了!!! 题目描述 Farmer John has decided to bring water to his N (1 <= N <= 300) pastur ...

  8. 洛谷 题解 P1550 【[USACO08OCT]打井Watering Hole】

    本题看似很难,实际上思路非常简单--如果你想通了. 首先有一个问题:图中有几个点?大部分的人会回答\(n\)个点.错了,有\(n+1\)个. 多出来的那个点在哪?关键在于你要理解每一个决策的意义.实际 ...

  9. 题解 P1550 【[USACO08OCT]打井Watering Hole】

    题面(翻译有点问题,最后一句话) 农民John 决定将水引入到他的n(1<=n<=300)个牧场.他准备通过挖若 干井,并在各块田中修筑水道来连通各块田地以供水.在第i 号田中挖一口井需要 ...

随机推荐

  1. 4.JSP内置对象

    JSP内置对象,JSP提供了由容器实现和管理的内置对象,也可以称之为隐含对象,这些内置对象不需要通过 JSP页面编写来实例化,在所有的JSP页面中都可以直接使用,它起到了简化页面的作用. 在JSP中一 ...

  2. 【PKUSC2019】线弦图【计数】【树形DP】【分治FFT】

    Description 定义线图为把无向图的边变成点,新图中点与点之间右边当且仅当它们对应的边在原图中有公共点,这样得到的图. 定义弦图为不存在一个长度大于3的纯环,纯环的定义是在环上任取两个不相邻的 ...

  3. springboot + mybatis sql日志

    #mapper sql日志 替换成你的mapper接口所在的包名 logging.level.com.example.dao=debug

  4. SRM331-CarolsSinging(暴力,位运算)

    Problem Statement When the Christmas dinner is over, it's time to sing carols. Unfortunately, not al ...

  5. JS框架_(JQuery.js)图片相册掀开切换效果

    百度云盘 传送门 密码:y0dk 图片掀开切换效果: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&quo ...

  6. 函数-this

    1.this. 解析器在调用函数的时候,每次都会向函数内部传递进一个隐含的参数(即this): this指向一个对象,这个对象称为函数执行的上下文对象.根据函数的调用方式的不同,this会指向不同的对 ...

  7. ubuntu16.04修改host上外網

    1.打开hosts文件: sudo emacs /etc/hosts 2.加入下面的内容 #chrome同步服务器 203.208.46.132 chrome.google.com203.208.46 ...

  8. 黑马lavarel教程---6、简单验证

    黑马lavarel教程---6.简单验证 一.总结 一句话总结: 1.验证的最简单实例:$request的validate方法,验证通过可以继续进行,验证失败就重定向 2.中文提示可以用中文语言包 3 ...

  9. SpringMvc的学习之路

    今天首先SpringMvc 写了个简单的配置 1.首先搭好环境配置web.xml <!-- 配置 DispatcherServlet --> <servlet> <ser ...

  10. 全面解读php-面向对象

    一.类的自动载入 //类的自动载入我们使用 spl_autoload_register($autoload_function ).我们需要在不同的地方包含更多不同的类文件,只需要多写几个 $autol ...