Python数据结构实验 图实验(二)

一、实验目的

1.掌握生成树和最小生成树方法,包括普里姆算法设计和克鲁斯卡尔算法设计;

2.掌握求解图的最短路径方法,包括单源最短路径的狄克斯特拉算法设计和多源最短路径的弗洛伊德算法设计;

3.灵活运用图数据结构解决一些综合的应用问题。

二、实验环境

1.Windows操作系统的计算机

2.Python3.7环境平台和PyCharm编辑器

三、实验说明 

1.实现最小生成树和图的最短路径算法程序设计方法。  
2.实验中如无特别说明,均要求使用脚本(.py)方式编写代码。

3.自主编写程序,必要时参考相关资料。

4.实验学时:2学时

四、实验内容和步骤

1.实验内容

(1) 编写一个实验程序,利用课本P261图7.31(a)的边数组,采用Prim算法求出以顶点0为起始顶点的一棵最小生成树。

参考思路:

from MatGraph import MatGraph,INF,MAXV



def Prim(g,v):                           #求最小生成树

    ……





#主程序

g=MatGraph()

n,e=6,10

a=__________                                             #图7.31(a)的边数组

g.CreateMatGraph(a,n,e)

print("图G1")

g.DispMatGraph()

print("求解结果");

Prim(g,0)





(2)编写一个图的实验程序,给定一个连通图,采用邻接表G存储,输出根结点为0的一棵深度优先生成树和一棵广度优先生成树,用相关数据进行测试。

参考思路:

from AdjGraph import AdjGraph,MAXV,INF      #引用邻接表存储结构

from collections import deque                              #引用双端队列deque



def DFSTree(G,v):                         #邻接表G中从顶点v出发的深度优先遍历

    global visited

    global T1

    visited[v]=1

    for j in range(len(G.adjlist[v])):      

        w=G.adjlist[v][j].adjvex            

        if visited[w]==0:

            T1.append([v,w])                

            DFSTree(G,w)         



def BFSTree(G,v):                     #邻接表G中从顶点v出发的广度优先遍历

    global T2

    qu=deque()                              

    visited[v]=1     

    qu.append(v)     

    while len(qu)>0:                        

        v=qu.popleft()     

        for j in range(len(G.adjlist[v])):  

            w=G.adjlist[v][j].adjvex        

            if visited[w]==0:     

                T2.append([v,w])

                visited[w]=1

                qu.append(w)



if __name__ == '__main__':

    G=AdjGraph()

    n,e=10,12

    a=[ [0,1,1,1,0,0,0,0,0,0],

        [1,0,0,0,1,1,0,0,0,0],

        [1,0,0,1,0,1,1,0,0,0],

        [1,0,1,0,0,0,0,1,0,0],

        [0,1,0,0,0,0,0,0,0,0],

        [0,1,1,0,0,0,0,0,0,0],

        [0,0,1,0,0,0,0,1,1,1],

        [0,0,0,1,0,0,1,0,0,0],

        [0,0,0,0,0,0,1,0,0,0],

        [0,0,0,0,0,0,1,0,0,0] ]



    print()

    print(" (1)由a创建邻接表G")

    G.CreateAdjGraph(a,n,e)

    print("  G:")

    G.DispAdjGraph()

    print(" (2)DFSTree构造深度优先生成树T1")

    T1=[]

    visited=[0]*MAXV

    DFSTree(G,0)

    print("  T1:",T1)

    print(" (3)BFSTree构造广度优先生成树T2")

    T2=[]

    visited=[0]*MAXV

    BFSTree(G,0)

    print("  T2:",T2)



2.实验步骤

(1)分析实验内容,写出程序大致框架或完整的程序代码。

(2)进入Python集成环境。

(3)编辑程序并进行保存。

(4)运行程序,若有错误,修改错误后再次运行,如此反复进行到不显示出错为止。

(5)检查程序输出结果。

五、实验代码与结果(程序运行代码及其结果)

1. (1)给出算法的基本设计思想。

  (2)根据设计思想,采用Python语言描述算法,关键之处给出注释。

from MatGraph import MatGraph, INF, MAXV



def Prim(g,v):                   #求最小生成树

  lowcost=[0]*MAXV          #建立数组lowcost

  closest=[0]*MAXV #建立数组closest

  for i in range(g.n): #给lowcost[]和closest[]置初值

     lowcost[i]=g.edges[v][i]

     closest[i]=v

  for i in range(1,g.n):    #找出最小生成树的n-1条边

      min=INF

      k=-1

      for j in range(g.n): #在(V-U)中找出离U最近的顶点k

        if lowcost[j]!=0 and lowcost[j]<min:

           min=lowcost[j]

           k=j          #k记录最小顶点的编号

      print("(%d,%d):%d" %(closest[k],k,+min),end=' ')   #输出最小生成树的边

      lowcost[k]=0     #将顶点k加入U中

      for j in range(g.n): #修改数组lowcost和closest

        if lowcost[j]!=0 and g.edges[k][j]<lowcost[j]:

           lowcost[j]=g.edges[k][j]

           closest[j]=k







#主程序

#主程序

g=MatGraph()

n,e=6,10

a=[

    [0, 3, 1, 4, INF, INF],

    [3, 0, 5, INF, 3, INF],

    [1, 5, 0, 5, 2, 1],

    [4, INF, 5, 0, 7, 6],

    [INF, 3, 2, 7, 0, 6],

    [INF, INF, 3, 6, 6, 0]

  ]                                     #图7.31(a)的边数组

g.CreateMatGraph(a,n,e)

print("图G1")

g.DispMatGraph()

print("求解结果");

Prim(g,0)


2. (1)给出算法的基本设计思想。

  (2)根据设计思想,采用Python语言描述算法,关键之处给出注释。

from AdjGraph import AdjGraph,MAXV,INF      #引用邻接表存储结构

from collections import deque                              #引用双端队列deque



def DFSTree(G,v):                         #邻接表G中从顶点v出发的深度优先遍历

    global visited

    global T1

    visited[v]=1

    for j in range(len(G.adjlist[v])):

        w=G.adjlist[v][j].adjvex

        if visited[w]==0:

            T1.append([v,w])

            DFSTree(G,w)



def BFSTree(G,v):                     #邻接表G中从顶点v出发的广度优先遍历

    global T2

    qu=deque()

    visited[v]=1

    qu.append(v)

    while len(qu)>0:

        v=qu.popleft()

        for j in range(len(G.adjlist[v])):

            w=G.adjlist[v][j].adjvex

            if visited[w]==0:

                T2.append([v,w])

                visited[w]=1

                qu.append(w)



if __name__ == '__main__':

    G=AdjGraph()

    n,e=10,12

    a=[ [0,1,1,1,0,0,0,0,0,0],

        [1,0,0,0,1,1,0,0,0,0],

        [1,0,0,1,0,1,1,0,0,0],

        [1,0,1,0,0,0,0,1,0,0],

        [0,1,0,0,0,0,0,0,0,0],

        [0,1,1,0,0,0,0,0,0,0],

        [0,0,1,0,0,0,0,1,1,1],

        [0,0,0,1,0,0,1,0,0,0],

        [0,0,0,0,0,0,1,0,0,0],

        [0,0,0,0,0,0,1,0,0,0] ]



    print()

    print(" (1)由a创建邻接表G")

    G.CreateAdjGraph(a,n,e)

    print("  G:")

    G.DispAdjGraph()

    print(" (2)DFSTree构造深度优先生成树T1")

    T1=[]

    visited=[0]*MAXV

    DFSTree(G,0)

    print("  T1:",T1)

    print(" (3)BFSTree构造广度优先生成树T2")

    T2=[]

    visited=[0]*MAXV

    BFSTree(G,0)

    print("  T2:",T2)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/503858.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

动态规划——回文串问题

目录 练习1&#xff1a;回文子串 练习2&#xff1a;最长回文子串 练习3&#xff1a;回文串分割IV 练习4&#xff1a;分割回文串 练习5&#xff1a;最长回文子序列 练习6&#xff1a;让字符串成为回文串的最小插入次数 本篇文章主要学习使用动态规划来解决回文串相关问题&…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《考虑新能源发电商租赁共享储能的电力市场博弈分析》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

将使用realsense相机录制的bag转化为TUM数据集格式

GitHub - kinglintianxia/bag2tum: ROS bag to tum dataset style files 基于以上代码进行实现&#xff1a; 1.创建文件夹&#xff1a; image ├── depth └── rgb 2.修改bag2tum.launch文件中的&#xff1a;save_folder, rgb_topic 和depth_topic参数&#xff1a; <par…

LeetCode Python - 83. 删除排序链表中的重复元素

目录 题目描述解法运行结果 题目描述 给定一个已排序的链表的头 head &#xff0c; 删除所有重复的元素&#xff0c;使每个元素只出现一次 。返回 已排序的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,1,2] 输出&#xff1a;[1,2] 示例 2&#xff1a; 输入&#x…

LeetCode题练习与总结:N皇后

一、题目描述 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff0c;返回所有不同的 n 皇后问题 的解决…

Matlab将日尺度数据转化为月尺度数据

日尺度转化为月尺度 clcclear all% load datadata xlread(data.xlsx) % 例如该数据为1961-01-01至2022-12-31&#xff0c;共计22645天data data(:,1:3) % 该数据有22645行&#xff0c;数据分别为降水&#xff0c;气温&#xff0c;湿度等三列dt datetime(1961-01-01):datatim…

政安晨:【Keras机器学习实践要点】(十)—— 自定义保存和序列化

目录 导言 涵盖的API Setup 状态保存自定义 构建和编译保存自定义 结论 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: TensorFlow与Keras机器学习实战 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在…

线程的安全问题

目录 导言&#xff1a; 正文&#xff1a; 1.共享资源&#xff1a; 2.非原子操作&#xff1a; 3.执行顺序不确定&#xff1a; 4.可见性&#xff1a; 5.死锁和饥饿&#xff1a; 6.指令重排序&#xff1a; 总结&#xff1a; 导言&#xff1a; 线程安全是并发编程中的一个…

文献阅读:使用 CellChat 推理和分析细胞-细胞通信

文献介绍 「文献题目」 Inference and analysis of cell-cell communication using CellChat 「研究团队」 聂青&#xff08;加利福尼亚大学欧文分校&#xff09; 「发表时间」 2021-02-17 「发表期刊」 Nature Communications 「影响因子」 16.6 「DOI」 10.1038/s41467-0…

Vue3 使用 v-bind 动态绑定 CSS 样式

在 Vue3 中&#xff0c;可以通过 v-bind 动态绑定 CSS 样式。 语法格式&#xff1a; color: v-bind(数据); 基础使用&#xff1a; <template><h3 class"title">我是父组件</h3><button click"state !state">按钮</button>…

解析CUDA FATBIN格式

参考文档&#xff1a; https://pdfs.semanticscholar.org/5096/25785304410039297b741ad2007e7ce0636b.pdf CUDA Pro Tip: Understand Fat Binaries and JIT Caching | NVIDIA Technical Blog cuda二进制文件中到底有什么 - 知乎 NVIDIA CUDA Compiler Driver NVIDIA CUDA…

HSP_04章_扩展: 进制、位运算

文章目录 10. 扩展: 进制11. 位运算11.1 二进制在运算中的说明11.2 原码 反码 补码11.3位运算符11.3.1 ~按位取反11.3.2 &按位与11.3.3 ^按位异或11.3.4 |按位或11.3.5 << 左移11.3.6 >> 右移 10. 扩展: 进制 进制介绍 进制的转换 2.1 其他进制转十进制 二进…

(八)目标跟踪中参数估计(似然、贝叶斯估计)理论知识

目录 前言 一、统计学基础知识 &#xff08;一&#xff09;随机变量 &#xff08;二&#xff09;全概率公式 &#xff08;三&#xff09;高斯分布及其性质 二、似然是什么&#xff1f; &#xff08;一&#xff09;概率和似然 &#xff08;二&#xff09;极大似然估计 …

国内顶级大牛整理:分布式消息中间件实践笔记+分布式核心原理解析

XMPP JMS RabbitMQ 简介 工程实例 Java 访问RabbitMQ实例 Spring 整合RabbitMQ 基于RabbitMQ的异步处理 基于RabbitMQ的消息推送 RabbitMQ实践建议 虚拟主机 消息保存 消息确认模式 消费者应答 流控机制 通道 总结 ActiveMQ 简介 工程实例 Java 访问ActiveMQ实例…

机器人寻路算法双向A*(Bidirectional A*)算法的实现C++、Python、Matlab语言

机器人寻路算法双向A*&#xff08;Bidirectional A*&#xff09;算法的实现C、Python、Matlab语言 最近好久没更新&#xff0c;在搞华为的软件挑战赛&#xff08;软挑&#xff09;&#xff0c;好卷只能说。去年还能混进32强&#xff0c;今年就比较迷糊了&#xff0c;这东西对我…

EasyRecovery2024汉化精简版,无需注册

EasyRecovery2024是世界著名数据恢复公司 Ontrack 的技术杰作&#xff0c;它是一个威力非常强大的硬盘数据恢复软件。能够帮你恢复丢失的数据以及重建文件系统。 EasyRecovery不会向你的原始驱动器写入任何东东&#xff0c;它主要是在内存中重建文件分区表使数据能够安全地传输…

FL Studio21.2.3中文版软件新功能介绍及下载安装步骤教程

FL Studio21.2中文版的适用人群非常广泛&#xff0c;主要包括以下几类&#xff1a; FL Studio 21 Win-安装包下载如下: https://wm.makeding.com/iclk/?zoneid55981 FL Studio 21 Mac-安装包下载如下: https://wm.makeding.com/iclk/?zoneid55982 音乐制作人&#xff1a…

C#/BS手麻系统源码 手术麻醉管理系统源码 商业项目源码

C#/BS手麻系统源码 手术麻醉管理系统源码 商业项目源码 手麻系统从麻醉医生实际工作环境和流程需求方面设计&#xff0c;与HIS&#xff0c;LIS&#xff0c;PACS&#xff0c;EMR无缝连接&#xff0c;方便查看患者的信息;实现术前、术中、术后手术麻醉信息全记录;减少麻醉医师在…

Spring Boot配置⽂件的格式

1、Spring Boot 配置⽂件有以下三种&#xff1a; &#xff08;1&#xff09;application.properties &#xff08;2&#xff09;application.yml &#xff08;3&#xff09;application.yaml 2、yml 为yaml的简写, 实际开发中出现频率最⾼. yaml 和yml 的使⽤⽅式⼀样 3、 4…

Vue + .NetCore前后端分离,不一样的快速发开框架

摘要&#xff1a; 随着前端技术的快速发展&#xff0c;Vue.NetCore框架已成为前后端分离开发中的热门选择。本文将深入探讨Vue.NetCore前后端分离的快速开发框架&#xff0c;以及它如何助力开发人员提高效率、降低开发复杂度。文章将从基础功能、核心优势、适用范围、依赖环境等…