惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

月光博客
月光博客
有赞技术团队
有赞技术团队
S
SegmentFault 最新的问题
宝玉的分享
宝玉的分享
量子位
小众软件
小众软件
The Cloudflare Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
大猫的无限游戏
大猫的无限游戏
C
Check Point Blog
G
Google Developers Blog
博客园 - 叶小钗
H
Help Net Security
Jina AI
Jina AI
Y
Y Combinator Blog
Last Week in AI
Last Week in AI
GbyAI
GbyAI
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Apple Machine Learning Research
Apple Machine Learning Research
MyScale Blog
MyScale Blog
T
Tailwind CSS Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Vercel News
Vercel News

OhYee 博客

小鹏辅助驾驶测评|OhYee 博客 小鹏非支持手机开启自动解锁|OhYee 博客 使用函数计算实现 301 重定向|OhYee 博客 针对 HTML 内容使用 Ant Design 图片弹框|OhYee 博客 博客进程泄露及僵尸进程解决|OhYee 博客 蓝易云服务器体验|OhYee 博客 SSH 调起本地 VSCode|OhYee 博客 【2022 秋招内推】阿里云后端研发工程师|OhYee 博客 使用函数计算获取 IP 地址信息|OhYee 博客 正确获取客户端 IP/HTTP Header 也可能重复|OhYee 博客 评测 Oculus Quest2 及 BigScreen|OhYee 博客 NextJS 热重载保留状态|OhYee 博客 如何优雅地贴 gist 代码|OhYee 博客 Linux 精细化文件权限|OhYee 博客 VSCode 容器开发环境|OhYee 博客 Clash 的不兼容更新排查|OhYee 博客 Zeek 导出 PCAP|OhYee 博客 记一次 ssh 配置问题|OhYee 博客 Git Commit 规范化工具|OhYee 博客 谈谈《星之卡比-探索发现》|OhYee 博客 VSCode 快捷键绑定 Shell 命令|OhYee 博客 ASN.1 语法及 X.509 证书格式解析解析|OhYee 博客 腾讯企业邮箱忽略 MX 记录发信|OhYee 博客 Chrome/Edge 标签组插件|OhYee 博客 【应届内推】阿里云后端研发工程师|OhYee 博客 损坏的 Typecho 备份处理为 JSON|OhYee 博客 VS Code VIM 插件高效使用|OhYee 博客 SSH 正反向代理|OhYee 博客 Let's Encrypt 根证书过期引发的问题|OhYee 博客 OpenWRT 忽略内核依赖|OhYee 博客
COGS 185.挖水井|OhYee 博客
2017-03-06 · via OhYee 博客

这是一篇最后编辑于 8 年前 的文章,其内容可能与目前实际情况差异较大,请注意甄别

题目

{% raw %}

{% endraw %}

农夫约翰决定给他的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)。
请确定农夫约翰为了完成浇灌所有的牧场所需的最小的总花费。

{% raw %}


{% endraw %}

第1行:一个单独的整数n。
第2..n+1行:第i+1行包含一个单独的整数w_i。
第n+2..2n+1行:第n+1+i行包含n个用空可分开的整数;其中第j个数是p_ij。

{% raw %}


{% endraw %}

第1行:一个单独的整数,表示花费。

{% raw %}




{% endraw %}

4
5
4
4
3
0 2 2 2
2 0 3 3
2 3 0 4
2 3 4 0

{% raw %}





{% endraw %}

题解

首先建成图,可以发现最终结果是把所有点都直接或间接与水相连
因此可以再建立一个源点代表水流
每个点挖井的花费就是各个点到水流的距离

这样只需要跑一遍最小生成树就行了

代码

```cpp 挖水井 https://github.com/OhYee/sourcecode/tree/master/ACM 代码备份 #include

#include #include using namespace std;

typedef long long LL;
const int maxn = 305;
int dis[maxn][maxn];
int f[maxn];
int pos;

struct Edge{
int u,v,w;
Edge(int a=0,int b=0,int c=0):u(a),v(b),w(c){}
bool operator < (const Edge &rhs)const{
return w < rhs.w;
}
}e[maxn*maxn];

int ufs(int x){
return f[x] == x ? x : f[x] = ufs(f[x]);
}
LL Kruskal(int n,int m) {
LL w = 0;
for(int i = 0; i < n; i++)
f[i] = i;
sort(e,e + m);
for(int i = 0; i < m; i++) {
int x = ufs(e[i].u),y = ufs(e[i].v);
if(x != y) {
f[x] = y;
w += e[i].w;
//cout << e[i].u << " "<<e[i].v<<" "<<e[i].w<<endl;
}
}
return w;
}

int main(){
freopen("water.in","r",stdin);
freopen("water.out","w",stdout);

cin.tie(0);
cin.sync_with_stdio(0);

pos=0;

int n;
cin>>n;
for(int i=1;i<=n;i++){
    int t;
    cin>>t;
    e[pos++] = Edge(0,i,t);
}
for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++){
        int t;
        cin>>t;
        if(i<j)
            e[pos++] = Edge(i,j,t);
    }

cout << Kruskal(1+n,pos) << endl;

}

</div>