0. Prim和Kruskal算法的区别
|
基本思想 |
时间复杂度 |
使用场景 |
Prim |
将顶点逐个加入集合,维护minDist[] ,贪心选择距离集合最近的顶点加入。 |
|
运行效率与节点数相关,与边数无关。适合稠密图。 |
Kruskal |
先对边进行排序;再选择连接不同分量的最短边(使用并查集 判断是否处于不同分量)。 |
|
运行效率只与边数相关。适合稀疏图。 |
1. Prim算法(卡码网 53)
def prim(graph) -> int:
result = 0
visited = [False for _ in range(len(graph))]
minDist = [10001 for _ in range(len(graph))]
visited[1] = True
for i in range(2, len(minDist)):
minDist[i] = graph[1][i]
for i in range(len(minDist)-2):
node_to_add = -1
minVal = 10001
for j in range(2, len(minDist)):
if visited[j] == False and minDist[j] < minVal:
minVal = minDist[j]
node_to_add = j
visited[node_to_add] = True
result += minVal
for j in range(2, len(minDist)):
if visited[j] == False and graph[node_to_add][j] < minDist[j]:
minDist[j] = graph[node_to_add][j]
return result
def main():
num_node, num_edge = map(int, input().split())
graph = [[10001 for _ in range(num_node+1)] for _ in range(num_node+1)]
for _ in range(num_edge):
node1, node2, val = map(int, input().split())
graph[node1][node2] = val
graph[node2][node1] = val
print(prim(graph))
if __name__ == "__main__":
main()
2. Kruskal算法(卡码网 53)
class Edge:
def __init__(self, node1, node2, val):
self.node1 = node1
self.node2 = node2
self.val = val
class UnionFindSet:
def __init__(self, n):
self.father = list(range(n))
def find(self, node1:int) -> int:
if node1 != self.father[node1]:
self.father[node1] = self.find(self.father[node1])
return self.father[node1]
def join(self, node1: int, node2: int):
root1 = self.find(node1)
root2 = self.find(node2)
if root1 != root2:
self.father[root2] = root1
def isSame(self, node1: int, node2: int):
return self.find(node1) == self.find(node2)
def kruskal(num_node, edges) -> int :
ufs = UnionFindSet(num_node + 1)
edges.sort(key=lambda edge: edge.val)
result = 0
for e in edges:
if ufs.isSame(e.node1, e.node2) == False:
ufs.join(e.node1, e.node2)
result += e.val
return result
def main():
num_node, num_edge = map(int, input().split())
edges = []
for _ in range(num_edge):
node1, node2, val = map(int, input().split())
edges.append(Edge(node1, node2, val))
print(kruskal(num_node, edges))
if __name__ == "__main__":
main()
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库