【刷题日记】leetcode1135 最低成本连通所有城市 python

leetcode原题描述为:
地图上有 N 座城市,它们按以 1 到 N 的次序编号。

可连接的选项 conections中每个选项 conections[i] = [city1, city2, cost] 表示将城市 city1 和城市 city2 连接所要的成本。(连接是双向的,也就是说城市 city1 和城市 city2 相连也同样意味着城市 city2 和城市 city1 相连)。

返回使得每对城市间都存在将它们连接在一起的连通路径(可能长度为 1 的)最小成本。该最小成本应该是所用全部连接代价的综合。如果根据已知条件无法完成该项任务,则请你返回 -1。

示例1:

输入:N = 3, conections = [[1,2,5],[1,3,6],[2,3,1]]
输出:6
解释:
选出任意 2 条边都可以连接所有城市,我们从中选取成本最小的 2 条。

示例2:

输入:N = 4, conections = [[1,2,3],[3,4,4]]
输出:-1
解释:
即使连通所有的边,也无法连接所有城市。

其实就是最小生成树问题。
可以使用Prim算法或者Krustal算法来解决最小生成树问题(简单示例:图基础知识最小生成树,详细示例:Krustal详解)

在确认当前边加入是否会出现环的时候,涉及到一个并查集的概念(find函数找当前连通区域的树根),
强烈推荐阅读:超有爱的并查集~

以下代码主要参考:Leetcode 1135

# 没有测试。不确定是否全A,思路供参考
def MST(N,connections):
    # 如果连接数目小于N-1,则不存在最小生成树
    if len(connections)<N-1:
        return -1
    
    # 每个结点初始时没有连通,连通域的根结点是自己,没有父亲结点或者说父亲结点是自己
    parrent = [i+1 for i in range(N)]
    # 查找结点的根
    def find(x):
        while x!=parrent[x]:
            x = parrent[x]
        return x
    # 寻找加入当前边连接的两个结点后,
    # 使用Krustal算法对连接权重从小到大进行合并,合并N-1条边
    # 1. 边排序
    connections.sort(key = lambda a:a[2])#依据connections[i][2]进行排序
    res = 0 # 成本累计
    edge = 0 # MST中的边数
    k = 0  # 访问connections
    while edge < N-1:
        org,dst,distance = connections[k]
        k+=1
        org_parrent = find(org)
        dst_parrent = find(dst)

        if org_parrent!=dst_parrent:
            edge+=1 # 把边加入
            res += distance # 累计权重
            parrent[org_parrent] = dst_parrent # 合并两部分
    return resdef MST()

猿辅导面试的问题是:
一个N*N的矩阵,矩阵的值代表连通两个城市的铺路成本,求最小连通所有城市的成本。

你可能感兴趣的:(刷题日记)