Prim算法求最小生成树【Python】

该代码实现了一个简化版的Prim算法,用于找到给定加权无向图的最小生成树。当前版本未处理图不连通的情况,但预留了后续扩展的可能。程序首先选取最小字母作为起点,然后逐步添加边到生成树中,直到所有节点都被包含。在每一步中,都会更新相邻节点的距离并选择最小距离的节点加入生成树。
摘要由CSDN通过智能技术生成

算法作业,实际没有考虑图不连通的情况 ,以后再加

 

# 选出最小字母
def sort(V):
    min = 0
    for i in range(1, len(V)):
        if ord(V[i]) < ord(V[min]):
            min = i
    return V[min]


def PRIM(G, T, U, V, dist, min):
    # 从最小的点开始
    U.append(min)
    V.remove(min)
    dist[min] = 0
    for v1, v2, w in G:
        if v1 == min:
            temp = v2  # 相邻边
        elif v2 == min:
            temp = v1
        else:
            continue
        dist[temp] = w
    prim(G, T, U, V, dist)


def prim(G, T, U, V, dist):
    if not V:
        return

    # 需要更新的点集
    upgrade_dist = []

    change = False
    min = V[0]

    for i in range(len(V)):
        if dist[V[i]] < dist[min]:
            min = V[i]
        elif dist[V[i]] == dist[min]:
            if ord(V[i]) < ord(min):
                min = V[i]
        else:
            continue

    for v1, v2, w in G:
        if v1 == min:
            temp = v2  # 相邻边
        elif v2 == min:
            temp = v1
        else:
            continue

        # 更新距离
        if temp not in U and (dist[temp] > w):
            dist[temp] = w
            upgrade_dist.append(temp)
        elif temp in U and change == False:
            if (min, temp, dist[min]) in G:
                T.append((min, temp, dist[min]))
                V.remove(min)
                U.append(min)
                change = True
            elif (temp, min, dist[min]) in G:
                T.append((temp, min, dist[min]))
                V.remove(min)
                U.append(min)
                change = True

    prim(G, T, U, V, dist)


if __name__ == "__main__":
    m, n = map(int, input("请输入点和边的个数,以逗号分隔:").split(","))
    print(m, n)
    print("按序输入:相邻两点,边的权重,以逗号分隔:")
    # 图的信息、生成树、生成树点集、未进入生成树的点集
    G, T, U, V = [], [], [], []

    for i in range(n):
        V_1, V_2, E = input("").split(",")
        G.append((V_1, V_2, int(E)))
        V.append(V_1)
        V.append(V_2)

    # 去重
    V = list(set(V))

    # 距离,字典存储,后续更新
    dist = dict.fromkeys(V, float('inf'))

    PRIM(G, T, U, V, dist, sort(V))

    print("最小生成树为:")
    for v1, v2, w in T:
        print(v1, v2, w, )

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值