题目の传送门:https://www.luogu.org/problem/show?pid=1550

精简版题意(本来就精简了不是么):n个点,每个点可以选择打井或从别的有水的点引水,求所有点都有水用的最小费用。(我是不是一说反而更不懂了)

这题其实并不是很难,讲道理贪心都能过。。
令我感到有趣的是这题中一种非常神奇的解题思路。。

首先,如果这个题没有打井的选项,显然是最小生成树
然而我们现在要打井,就不能直接用最小生成树做了。。
殊不知,这题还是一个最小生成树~

这就需要一些小小的、巧妙的办法了。。哦,

新建一个伪节点n+1,向每个点连边,边权是这一点打井的费用!!!

然后我们就可以跑最小生成树了2333
话说是不是只有我一个人觉得这方法很巧妙orz
似乎可以证明?其实证明不看也就不看了。。

在最小生成上,抛开我们新建的伪节点不看,剩下的部分一定是一个或多个连通块,而且这些连通块也满足最小生成树的性质,费用是最小的。而这些连通块中,需要有一个打井费用最小的节点来打井,这一点我们跑最小生成树的时候就连到了伪节点上。
显然,对于点i,如果引水费用小于打井,跑最小生成树时就会连到连通块上,表示选择引水,反之则连到伪节点上,表示打井。因为最小生成树上有伪节点存在,从而保证了至少有一个点与其相连,即至少有一个点选择打井。

十分不严谨的证明完了,大家理解就好,不要深究。。

然后就是代码了,明白了原理就非常简单了。。
尽管图非常稠密,然而我还是跑Kruskal,毕竟数据范围只有N<=300,边数也不会超过10W
其实我不太会Prim(尤其是堆优化Prim)= =

代码:

#include <cstdio>
#include <algorithm>
using std::sort; const int MAXV=303;
const int MAXE=MAXV*MAXV+100; struct edge{
int from,to,data;
}e[MAXE]; int fa[MAXV],tot,cnt,ans; int find(int x){
if(fa[x]!=x) fa[x]=find(fa[x]);
return fa[x];
} inline int gnum(){
int a=0;char c=getchar();bool f=0;
for(;(c<'0'||c>'9')&&c!='-';c=getchar());
if(c=='-') c=getchar(),f=1;
for(;c>='0'&&c<='9';c=getchar()) a=(a<<1)+(a<<3)+c-'0';
if(f) return ~a+1; return a;
} bool operator <(const edge &a,const edge &b){
return a.data<b.data;
} void build(int x,int y,int z){
e[++tot].from=x; e[tot].to=y; e[tot].data=z;
} int main(){
int n=gnum();
for(int i=1;i<=n;i++)
build(i,n+1,gnum()),fa[i]=i;
fa[n+1]=n+1;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
build(i,j,gnum());
sort(e+1,e+tot+1);
for(int i=1;i<=tot;i++){
if(cnt==n) break;
int x=find(e[i].from),y=find(e[i].to);
if(x-y) fa[y]=x,ans+=e[i].data;
}
printf("%d",ans);
}

就这样,虽然跑得慢,但是能过嘛= =

你说贪心?留给你自己思索去吧~~

【学术篇】洛谷1550——打井Watering Hole的更多相关文章

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

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

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

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

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

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

  4. Luogu P1550 打井Watering Hole

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

  5. LCT总结——概念篇+洛谷P3690[模板]Link Cut Tree(动态树)(LCT,Splay)

    为了优化体验(其实是强迫症),蒟蒻把总结拆成了两篇,方便不同学习阶段的Dalao们切换. LCT总结--应用篇戳这里 概念.性质简述 首先介绍一下链剖分的概念(感谢laofu的讲课) 链剖分,是指一类 ...

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

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

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

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

  8. 洛谷P1550打井

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

  9. luogu P1550 [USACO08OCT]打井Watering Hole

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

随机推荐

  1. NX二次开发-常用lib库文件

    在项目属性->配置属性->链接器->输入->附加依赖项: libufun.lib UFUNC API 函数库 libugopenint.lib UFUNC 对话框 API 函数 ...

  2. idea从零搭建简单的springboot+Mybatis

    需用到的sql /* Navicat MySQL Data Transfer Source Server : localhost root Source Server Version : 80012 ...

  3. Spring-Security (补充)

    一.配置静态资源过滤 直接在xml中配置即可 <!-- 配置静态资源过滤 --> <security:http security="none" pattern=& ...

  4. 全局唯一标识符(GUID,Globally Unique Identifier)

    全局唯一标识符(GUID,Globally Unique Identifier)是一种由算法生成的二进制长度为128位的数字标识符.GUID主要用于在拥有多个节点.多台计算机的网络或系统中.在理想情况 ...

  5. 在jsp页面直接读取mysql数据库显示数据

    闲来无事,学学java,虽说编程语言相通,但是接触一门新知识还是有些疑惑,边学边记录,方便以后温故. 直接给出代码: <%@page import="java.sql.ResultSe ...

  6. axios全局拦截响应

    在系统开发过程中,若遇到长时间未操作,则需要将页面跳转到登录页面.因为现在都是前后端分离的开发模式,路由跳转都交给前端,而后端只返回一个报错信息,例如"errorMsg":&quo ...

  7. eclipse导入别人项目配置tomcat和jdk

    1.file--import--General--Existing Projiect into Workspace-- 2.导入项目成功后,项目会有错误,需重新进行tomcat及jdk的配置 项目名右 ...

  8. de4Dot用法 解决 .net程序 reflecter反编译 “索引超出了数组界限”问题

    de4Dot 反混淆工具.当你反编译 .net写的dll 或exe时出现:索引超出了数组界限 问题时 可以去网上下这个工具,通过cmd命令 打开de4dot的exe 空格 dll的全路径. 这样 :D ...

  9. Python高级核心技术97讲✍✍✍

    Python高级核心技术97讲  整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课程本身没问题,大家看的时候可以 ...

  10. The linux command 之 扩展

    echo * " * "字符意味着匹配文件名中的任意字符,shell会在执行echo命令之前把*扩展成其他内容. 一.路径扩展(pathname Expansion) 通过使用通配 ...