【python算法】Kruskal算法求最小生成树模板
【模板】Floya
859. Kruskal算法求最小生成树 - AcWing题库https://www.acwing.com/problem/content/description/861/
题目描述:
给定一个n个点m条边的无向图,图中可能存在重边和自环,边权可能为负数。
求最小生成树的树边权重之和,如果最小生成树不存在则输出impossible。
给定一张边带权的无向图=(V,E),其中V表示图中点的集合,E表示图中边的集合,n=|V\,m =|E。
由V中的全部n个顶点和E中n―1条边构成的无向连通子图被称为G的一棵生成树,其中边的权值之和最小的生成树被称为无向图的最小生成树。
输入格式:
第一行包含两个整数n和m。
接下来m行,每行包含三个整数u, v, ww,表示点u和点v之间存在一条权值为w的边。
输出格式:
共一行,若存在最小生成树,则输出一个整数,表示最小生成树的树边权重之和,如果最小生成树不存在则输出impossible 。
数据范围:
输入样例:
4 5
1 2 1
1 3 2
1 4 3
2 3 2
3 4 4
输出样例:
6
参考题解 :
from collections import defaultdict, deque
def find(x):
if not p[x] == x:
p[x] = find(p[x])
return p[x]
n, m = map(int, input().split())
p = [_ for _ in range(n + 1)]
g = []
for _ in range(m):
g.append(tuple(map(int, input().split())))
g.sort(key=lambda x:x[2])
cnt = 0
res = 0
for u, v, w in g:
eu = find(u)
ev = find(v)
if eu == ev: continue
p[ev] = eu
res += w
cnt += 1
print('impossible') if not cnt == n - 1 else print(res)
番外:
课程简介:
本课程是AcWing系列课程Level-2。本课程会系统讲解基础算法与数据结构的 原理,并给出相应 代码模板。
课后会布置相应打卡题目,加以巩固。
直播支持回放功能,供同学们课后复习使用。整个课程已全部讲完,试听课在这里。
录像和打卡功能永久有效。时间安排
视频总共45小时左右。费用
费用总共200元。拼团优惠
单独报名200元
三人拼团每人149元
拼团方式:点击右上角“报名”后,选择“拼团报名”,付款后邀请好友即可。每个团有效时间为24小时,超过时间后订单自动取消,已付金额会自动退回原账户。
学习奖励:报名后在AcWing杯 - 周赛中取得前10%的成绩,返5AC币,以及一枚成就勋章。
仅限一次。
知识点
基础算法 —— 代码模板链接 常用代码模板1——基础算法排序
二分
高精度
前缀和与差分
双指针算法
位运算
离散化
区间合并
数据结构 —— 代码模板链接 常用代码模板2——数据结构链表与邻接表:树与图的存储
栈与队列:单调队列、单调栈
kmp
Trie
并查集
堆
Hash表
搜索与图论 —— 代码模板链接 常用代码模板3——搜索与图论DFS与BFS
树与图的遍历:拓扑排序
最短路
最小生成树
二分图:染色法、匈牙利算法
数学知识 —— 代码模板链接 常用代码模板4——数学知识质数
约数
欧拉函数
快速幂
扩展欧几里得算法
中国剩余定理
高斯消元
组合计数
容斥原理
简单博弈论
动态规划背包问题
线性DP
区间DP
计数类DP
数位统计DP
状态压缩DP
树形DP
记忆化搜索
贪心时空复杂度分析
课程交流
遇到任何问题,可以加yxc的QQ:2925956006
另外可以加入AcWing算法交流群:696750166作者:AcWing
链接:https://www.acwing.com/activity/content/11/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
完毕!
如果觉得有用,麻烦大家三连一下,谢谢!