标签:distance 数据中心 python father rank edge lists root csp
样例输入
4
5
1
1 2 3
1 3 4
1 4 5
2 3 8
3 4 2
样例输出
4
样例说明
思路:
链接:https://pan.baidu.com/s/17JQtM3O6LpHHZ5diUTXS5w
提取码:0naq
这道题其实就是求最小生成树的最大权值。求最小生成树有两种算法,Prim算法和Kruskal算法。关于这两个算法的ppt讲解见上方百度网盘链接。以下代码使用的是并查集的方法去解决。并查集算法教学视频
代码
from operator import attrgetter
class Edge(object):
def __init__(self,From,to,distance):
self.From = From
self.to = to
self.distance = distance
father = []
result = 0
def init(number): #初始化father列表
global father
father = [-1] * number #-1代表当前元素没有父节点
def find_root(x): #找到元素x的父节点
global father
x_root = x
while father[x_root] != -1:
x_root = father[x_root]
return x_root
def union(x,y,distance,rank): #合并
global father
global result
x_root = find_root(x)
y_root = find_root(y)
#两个元素的父节点不同,说明不在一个集合里,也即不会构成回路
if x_root != y_root:
#使用按秩合并的方法进行优化
if rank[x_root] > rank[y_root]:
father[y_root] = x_root
elif rank[x_root] < rank[y_root]:
father[x_root] = y_root
else:
father[x_root] = y_root
rank[y_root] += 1
result = distance
vNum = int(input())
sNum = int(input())
root = int(input())
init(vNum + 1) #加1的原因是,列表下标是从0开始,而结点从1开始
lists = []
for i in range(sNum):
From,to,distance = map(int,input().split())
edge = Edge(From,to,distance)
lists.append(edge)
lists = sorted(lists,key = attrgetter('distance')) #按距离的大小,从小到大排序
rank = [0] * (vNum + 1)
for i in range(sNum):
edge = lists[i]
From,to,distance = edge.From,edge.to,edge.distance
union(From,to,distance,rank)
print(result)
标签:distance,数据中心,python,father,rank,edge,lists,root,csp 来源: https://blog.csdn.net/l903445981/article/details/110739724
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。