数据中心(优化MST)

时间限制:1.0s
内存限制:512.0MB
问题描述:


样例输入

4
5
1
1 2 3
1 3 4
1 4 5
2 3 8
3 4 2

样例输出

4

样例说明

  下图是样例说明。

求最小生成树的最大边,注意要用优化算法。另外,还是克鲁斯卡尔算法快些,不过还得看点和边的情况

 
class node:
    fro=to=dist=0
def getfx(x):
    if fa[x]==x:
        return fa[x]
    fa[x] = getfx(fa[x])
    return fa[x]
def merge(x,y):
    tx = getfx(x)
    ty = getfx(y)
    fa[tx] = ty    
while True:
    try:
        graph = []
        n = int(input())
        m = int(input())
        root = int(input())
        for i in range(m):
            a,b,c = map(int,input().split())
            graph.append([a,b,c])
            #print(graph[i].dist)
        graph = sorted(graph,key = lambda x:x[2])
        # for i in range(m):
            # print(graph[i][2])
        fa = [0 for i in range(100005)]
        for i in range(n+1):
            fa[i]=i
        #print(1)
        # for i in range(m):
            # print(graph[i].dist)
        ans = -1
        last = n
        k = 0
        while k<m and last>1:
            u = graph[k][0]
            v = graph[k][1]
            if not (getfx(u)==getfx(v)):
                merge(u,v)
                last-=1
                #ans+=graph[k][2]
                ans = max(ans,graph[k][2])
            k+=1                
        print(ans)    
    except:             
        break
 
 

 

转的:
from queue import PriorityQueue as pQueue

# 用优先队列实现的prim算法
def prim(start, graph):
    n = len(graph)
    pq = pQueue()  # 队列中的元素为[cost, v]形式,cost是该路径的花销, v是去往的结点
    visited = [False for _ in range(n)]
    t = {}
    parents = [-1 for _ in range(n)]
    pq.put([0, start, -1])
    while len(t) < n:
        # 从优先队列中找出未被确定的最短路径
        minPath = pq.get()
        while visited[minPath[1]]:
            minPath = pq.get()
        minNode = minPath[1]
        visited[minNode] = True
        t[minNode] = minPath[0]
        parents[minNode] = minPath[2]

        # 从该最短路径的结点开始找邻边,入队
        for edge in graph[minPath[1]]:
            if not visited[edge[0]]:
                pq.put([edge[1], edge[0], minNode])
    return t, parents


n = int(input())
m = int(input())
root = int(input()) - 1
graph = [[] for _ in range(n)]
for i in range(m):
    v, u, t = map(int, input().split())
    v -= 1
    u -= 1
    graph[v].append([u, t])
    graph[u].append([v, t])

t, parents = prim(root, graph)
ans = 0
for k, v in t.items():
    if v > ans:
        ans = v
print(ans)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值