【图论】最小生成树的应用

一.题目

P1550 [USACO08OCT] Watering Hole G - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)


二.分析

1.我们是要使所有的农场都要有水

2.可以从起点引水,也可以互相引水。

3.费用要最小

这时我们可以想到最小生成树,建立一个虚拟节点即可。思路一目了然。


三.参考代码

cpp 复制代码
#include<bits/stdc++.h>
#define maxn 91000
using namespace std;
struct Edge{
	int u,v,w;
}edge[maxn];
int n,cnt;
int fa[305];
int find(int x){
	return x==fa[x] ? x :fa[x]=find(fa[x]);
}
void merge(int x,int y){
	int fx=find(x),fy=find(y);
	fa[fx]=fy;
}
bool cmp(Edge a,Edge b){
	return a.w<b.w;
}
long long ans;
void kruskal(){
	sort(edge+1,edge+cnt+1,cmp);
	int tot=0;
	for(int i=1;i<=cnt;i++){
		int x=edge[i].u,y=edge[i].v;
		if(find(x)==find(y)) continue;
		tot++;
		ans+=edge[i].w;
		merge(x,y);
		if(tot==n) return;
	}
}
int main(){
	scanf("%d",&n);
	int w;
	for(int i=1;i<=n;i++){
		scanf("%d",&w);
		edge[++cnt]=(Edge){0,i,w};
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			scanf("%d",&w);
			if(w!=0){
				edge[++cnt]=(Edge){i,j,w};
			}
		}
	}
	for(int i=1;i<=n;i++) fa[i]=i;
	kruskal();
	cout<<ans;
	return 0;
}

四.总结

当看到这些条件,可以想到最小生成树

1.涉及到每个节点

2.最小/最大的值

3.一般都要用到虚拟节点,以处理初始点

相关推荐
春花秋月夏海冬雪2 分钟前
代码随想录刷题 - 贪心Part1
java·算法·贪心·代码随想录
环黄金线HHJX.6 分钟前
Tuan符号系统重塑智能开发
开发语言·人工智能·算法·编辑器
汀、人工智能44 分钟前
[特殊字符] 第2课:字母异位词分组
数据结构·算法·链表·数据库架构··字母异位词分组
小O的算法实验室1 小时前
2026年SEVC,面向主动成像卫星任务规划问题的群体智能与动态规划混合框架,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
网安INF1 小时前
数据结构第一章复习:基本概念与算法复杂度分析
数据结构·算法
幻风_huanfeng2 小时前
人工智能之数学基础:什么是凸优化问题?
人工智能·算法·机器学习·凸优化
三雷科技2 小时前
使用 `dlopen` 动态加载 `.so` 文件
开发语言·c++·算法
Yzzz-F2 小时前
Problem - 2146D1 - Codeforces &&Problem - D2 - Codeforces
算法
Kk.08022 小时前
力扣 LCR 084.全排列||
算法·leetcode·职场和发展
环黄金线HHJX.2 小时前
龙虾钳足启发的AI集群语言交互新范式
开发语言·人工智能·算法·编辑器·交互