网络算法-python实现prim(基于堆)

这篇具有很好参考价值的文章主要介绍了网络算法-python实现prim(基于堆)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一.prim算法重述

基本思想:

1.从任意顶点开始;

2.逐步扩展边界;

3.每次扩展,选择当前边界边中 最小权重者加入T;

4.直至T中包含的顶点覆盖原图。

伪代码:

X={s} //目前已覆盖顶点集合
T=空集;
WHILE X≠V
    令e(u,v)为权重最小的边界边(u∈X, v∉X)
    将e加入T;
    将v加入X;
ENDWHILE

二.prim算法证明

1.基本概念介绍

割:图G(V,E)的一个割(cut)是V的一个划分,该划分将集合V分为两个非空的集合。

Empty-Cut引理:图G不连通,当且仅当存在cut(A, B)没有割边。

圈与割边的关系:

Double-Crossing Lemma:如果某个圈C⊆E中有边跨越了cut(A, B),则C中必有其他边跨越cut(A, B)。 【至少还有一条】

Lonely-Cut Corollary:如果边e是跨越了cut(A, B)的唯一一条边,则e不可能在任一圈中。

2.prim算法证明

第一部分:Prim算法算出的是生成树。

网络算法-python实现prim(基于堆)

 注:上述图片来源于电子科技大学网络算法挑战性课程PPT。

第二部分:

网络算法-python实现prim(基于堆)

  注:上述图片来源于电子科技大学网络算法挑战性课程PPT。

3.prim的实现方式

1.最直接的实现方式

网络算法-python实现prim(基于堆)

  注:上述图片来源于电子科技大学网络算法挑战性课程PPT。

 2.边界边集合

网络算法-python实现prim(基于堆)

  注:上述图片来源于电子科技大学网络算法挑战性课程PPT。

3. 引入边界点集合

网络算法-python实现prim(基于堆)

 伪代码:

FOR all vertex j in V DO
    d(j) = ; p(j) = NULL;
X = {s}; T = NULL;
d(s) = 0; p(s) = NULL; 
WHILE X  V  DO
    i = FindMin(V-X);
    T = T U { (p(i), i) };
    X = X U {i};
    FOR every neighbor t of i
        IF w(i, t) < d(t) DO
            d(t) = w(i, t); p(t) = i;
    ENDFOR
ENDWHILE

4.数据结构堆实现

 

网络算法-python实现prim(基于堆)文章来源地址https://www.toymoban.com/news/detail-406204.html

  注:上述图片来源于电子科技大学网络算法挑战性课程PPT。

三.项目代码

from collections import defaultdict
data_edge=defaultdict(list)
nodes=[] #储存点
def build_graph(filepath,data_edge,nodes):#构造图
    f=open(filepath,'r')
    edge_num=f.readline()
    node_num=f.readline()
    for i in f.readlines():
        node_a,node_b,edge_c=i.split()
        data_edge[node_a].append((int(edge_c),node_a,node_b))
        data_edge[node_b].append((int(edge_c),node_b,node_a))
        if node_a not in nodes:
            nodes.append(node_a)
        if node_b not in nodes:
            nodes.append(node_b)
    f.close()

class heap(object): #数据结构堆
    def _init_(self):
        self.data=[]
    def get_parent_index(self,index):#获取父节点的下标
        if index==0 or index>len(self.data)-1:
            return None
        else:
            return (index-1)>>1
    def Exact_min(self):#取出最小值
        remove_data = self.data[0]
        self.data[0] = self.data[-1]
        del self.data[-1]
        self.heapify(self.data)# 将剩余数据堆化
        return remove_data
    def swap(self,index_a,index_b):#交换结点数据
        self.data[index_a], self.data[index_b]=self.data[index_b], self.data[index_a]
    def insert(self,data_key):#插入新来结点数据
        self.data.append(data_key)#先加到最后
        index=len(self.data)-1
        parent=self.get_parent_index(index)#先加入到堆的后面
        while parent is not None and self.data[parent][0]>=self.data[index][0]:# 交换操作
            self.swap(parent, index)
            index=parent
            parent=self.get_parent_index(parent)
    def heapify(self, arr):#建堆
            self.data=arr
            #print(arr)
            #print(self.data)
            index=self.get_parent_index(len(arr)-1)
            #print(index)
            while index!=None and index>=0:#从底部向上比较,把最小值弄到根节点
                if(2*index+1)<len(self.data):
                    if self.data[(2*index+1)]<self.data[index]:
                        self.swap(2*index+1,index)
                    if (2*index+2)<len(self.data) and (self.data[(2*index+2)]<self.data[index]):
                        self.swap(2*index+2,index)
                index=index-1
heap1=heap()
def prim(data_edge,nodes,start_node,heap1):#prim
    tree=[]#存储最小生成树边数据
    visited=[]#已探索过结点的集合
    visited.append(start_node)
    #print(data_edge[start_node])
    heap1.heapify(data_edge[start_node])
    while len(visited)!=len(nodes):
        edge_c,node_a,node_b=heap1.Exact_min()#选出距离最小的边数据
        if node_b not in visited:
            visited.append(node_b)
            tree.append((int(edge_c),node_a,node_b))
            for neighbor in data_edge[node_b]:#更新边集合
                if neighbor[2] not in visited:
                    heap1.insert(neighbor)
    return tree
build_graph('MST-test-3',data_edge,nodes)
ans=prim(data_edge,nodes,'1',heap1)
a=0
for i in ans:#计算权重和
    a+=i[0]
print(a)






到了这里,关于网络算法-python实现prim(基于堆)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Prim算法实现最小生成树

    例如:要在n个城市之间铺设光缆,主要目标是要使这n个城市的任意两个之间都可以通信,但铺设光缆的费用很高,且各个城市之间铺设光缆的费用不同,因此另一个目标是要使铺设光缆的总费用最低。这就需要找到带权的最小生成树。 将图中所有顶点分为两类:树顶点(已

    2024年02月11日
    浏览(32)
  • Python基于PyTorch实现卷积神经网络分类模型(CNN分类算法)项目实战

    说明:这是一个机器学习实战项目(附带 数据+代码+文档+视频讲解 ),如需 数据+代码+文档+视频讲解 可以直接到文章最后获取。 卷积神经网络,简称为卷积网络,与普通神经网络的区别是它的卷积层内的神经元只覆盖输入特征局部范围的单元,具有稀疏连接(sparse connec

    2024年02月15日
    浏览(36)
  • Python基于PyTorch实现卷积神经网络回归模型(CNN回归算法)项目实战

    说明:这是一个机器学习实战项目(附带 数据+代码+文档+视频讲解 ),如需 数据+代码+文档+视频讲解 可以直接到文章最后获取。 卷积神经网络,简称为卷积网络,与普通神经网络的区别是它的卷积层内的神经元只覆盖输入特征局部范围的单元,具有稀疏连接(sparse connec

    2024年02月15日
    浏览(33)
  • Python基于PyTorch实现循环神经网络回归模型(LSTM回归算法)项目实战

    说明:这是一个机器学习实战项目(附带 数据+代码+文档+视频讲解 ),如需 数据+代码+文档+视频讲解 可以直接到文章最后获取。 LSTM网络是目前更加通用的循环神经网络结构,全称为Long Short-Term Memory,翻译成中文叫作“长‘短记忆’”网络。读的时候,“长”后面要稍

    2024年02月16日
    浏览(44)
  • Python基于PyTorch实现循环神经网络分类模型(LSTM分类算法)项目实战

    说明:这是一个机器学习实战项目(附带 数据+代码+文档+视频讲解 ),如需 数据+代码+文档+视频讲解 可以直接到文章最后获取。 LSTM网络是目前更加通用的循环神经网络结构,全称为Long Short-Term Memory,翻译成中文叫作“长‘短记忆’”网络。读的时候,“长”后面要稍

    2024年02月16日
    浏览(35)
  • (数据结构)普利姆算法(Prim)实现

    假设要在n个城市之间建立通信联络网,每两个城市之间建立线路都需要花费不同大小的经费,则连通n个城市只需要n-1个条线路,最小生成树解决的问题就是: 如何在最节省经费的前提下建立这个通信网 也可以理解为:n个城市之间最多可以建立n(n-1)/2条线路,我们要从这里挑

    2024年02月03日
    浏览(35)
  • 竞赛保研 基于生成对抗网络的照片上色动态算法设计与实现 - 深度学习 opencv python

    🔥 优质竞赛项目系列,今天要分享的是 🚩 基于生成对抗网络的照片上色动态算法设计与实现 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分 工作量:3分 创新点:4分 🧿 更多资料, 项目分享: http

    2024年01月17日
    浏览(35)
  • C语言实现Prim算法 —构建最小生成树

    目录 介绍Prim算法前的相关概念 一、Prim算法的思想 二.1、利用图形详细解释Prim算法的思想 Prim算法思想介绍 ​ 二.2利用图形又又解释Prim算法的思想  三、用图示结合代码中重要量进行说明 四、代码实现(用c语言) 带权图 :边赋以权值的图称为网或带权图,带权图的生成树

    2024年02月08日
    浏览(24)
  • 基于生成对抗网络的照片上色动态算法设计与实现 - 深度学习 opencv python 计算机竞赛

    🔥 优质竞赛项目系列,今天要分享的是 🚩 基于生成对抗网络的照片上色动态算法设计与实现 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分 工作量:3分 创新点:4分 🧿 更多资料, 项目分享: http

    2024年02月06日
    浏览(34)
  • Python实现人工神经网络回归模型(MLPRegressor算法)并基于网格搜索(GridSearchCV)进行优化项目实战

    说明:这是一个机器学习实战项目(附带 数据+代码+文档+视频讲解 ),如需 数据+代码+文档+视频讲解 可以直接到文章最后获取。 1.项目背景 经济广告是指以营利为目的的广告,通常是商业广告,它是为推销商品或提供服务,以付费方式通过广告媒体向消费者或用户传播商

    2023年04月08日
    浏览(70)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包