ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

csp 数据中心 python

2020-12-06 16:29:48  阅读:260  来源: 互联网

标签: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. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有