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

一、实验目的

1.熟悉图的相关概念,包括有向图、无向图、完全图、子图、路径、简单路径、路径长度、回路等定义;

2.掌握图的各种存储结构,主要包括邻接矩阵和邻接表的相关算法设计;

3.掌握图的基本运算算法设计;

4.了解图的遍历过程,包括深度优先遍历和广度优先遍历。

二、实验环境

1.Windows操作系统的计算机

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

三、实验说明 

1.实现图的两种存储结构相关的算法程序设计方法。  
2.实验中如无特别说明,均要求使用脚本(.py)方式编写代码。

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

4.实验学时:2学时

四、实验内容和步骤

1.实验内容

编写一个图的实验程序,设计邻接表类AdjGraph和邻接矩阵类MatGraph,由带权有向图的边数组a创建邻接表G,由G转换为邻接矩阵g,再由g转换为邻接表G1,输出G、g和G1,用相关数据进行测试。

参考思路:

    

import copy



MAXV=100 #表示最多顶点个数

INF=0x3f3f3f3f             #表示∞



class ArcNode:                                                           #边结点

    def __init__(self,adjv,w):                                       #构造方法

        ……



class AdjGraph:             #图邻接表类

    def __init__(self,n=0,e=0):                                     #构造方法

        ……



    def CreateAdjGraph(self,a,n,e):                       #通过数组a、n和e建立图的邻接表

        ……

    

    def DispAdjGraph(self): #输出图的邻接表

        ……



class MatGraph:             #图邻接矩阵类

    def __init__(self,n=0,e=0):                                     #构造方法

        ……



    def CreateMatGraph(self,a,n,e):                   #通过数组a、n和e建立图的邻接矩阵

        ……



    def DispMatGraph(self):             #输出图

        ……



def MatToAdj(g):                                                  #由图的邻接矩阵转换为邻接表

    G=AdjGraph(g.n,g.e)

    for i in range(g.n):

        adi=[]                          

        for j in range(g.n):

            if g.edges[i][j]!=0 and g.edges[i][j]!=INF:

                p=ArcNode(j,g.edges[i][j])  

                adi.append(p)               

        G.adjlist.append(adi)

    return G



def AdjToMat(G):                                                  #由图的邻接表转换为邻接矩阵

    g=MatGraph(G.n,G.e)

    g.edges=[[INF]*g.n for i in range(g.n)]

    for i in range(g.n):                

        g.edges[i][i]=0

    for i in range(g.n):

        for p in G.adjlist[i]:

            g.edges[i][p.adjvex]=p.weight

    return g





if __name__ == '__main__':

    G=AdjGraph()

    n,e=__,___

    a=[____________]

    print()

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

    __________________

    print("  G:")

    __________________

    print(" (2)G->g")

    __________________

    print("  g:")

    __________________

    print(" (3)g->G1")

    __________________

    print("  G1:")

    __________________

    

2.实验步骤

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

(2)进入Python集成环境。

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

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

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

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

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

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

import copy

MAXV=100 #表示最多顶点个数

INF=0x3f3f3f3f             #表示∞



class ArcNode:                                                           #边结点

    def __init__(self, adjv, w):  #构造方法

        self.adjvex = adjv       #邻接点编号

        self.weight = w          #边的权值



class AdjGraph:             #图邻接表类

    def __init__(self,n=0,e=0):                                     #构造方法

        self.n = n                 #顶点数

        self.e = e                 #边数

        self.adjlist = []  #邻接表数组



    def CreateAdjGraph(self,a,n,e):                       #通过数组a、n和e建立图的邻接表

        self.n = n

        self.e = e

        for i in range(n):

            adi = []

            for j in range(n):

                if a[i][j] != 0 and a[i][j] != INF:

                    p = ArcNode(j,a[i][j])

                    adi.append(p)

            self.adjlist.append(adi)



    def DispAdjGraph(self): #输出图的邻接表

        for i in range(self.n):

            print(" 顶点 %d:" %(i), end='')

            for p in self.adjlist[i]:

                print(" -> %d(%d)" %(p.adjvex, p.weight), end='')

            print("->^")



class MatGraph:             #图邻接矩阵类

    def __init__(self,n=0,e=0):          #构造方法

        self.edges=[]          #邻接矩阵数组

        self.vexs=[]              #vexs[i]存放顶点i的信息,暂时未用

        self.n=n                         #顶点数

        self.e=e          #边数





    def CreateMatGraph(self,a,n,e):                   #通过数组a、n和e建立图的邻接矩阵

        self.n=n                      #置顶点数和边数

        self.e=e

        self.edges=copy.deepcopy(a)    #深拷贝





    def DispMatGraph(self):               #输出图的邻接矩阵

      for i in range(self.n):

        for j in range(self.n):

           if self.edges[i][j]==INF:

              print("%4s"%("∞"),end=' ')

           else:

              print("%5d" %(self.edges[i][j]),end=' ')

        print()





def MatToAdj(g):                                                  #由图的邻接矩阵转换为邻接表

    G=AdjGraph(g.n,g.e)

    for i in range(g.n):

        adi=[]

        for j in range(g.n):

            if g.edges[i][j]!=0 and g.edges[i][j]!=INF:

                p=ArcNode(j,g.edges[i][j])

                adi.append(p)

        G.adjlist.append(adi)

    return G



def AdjToMat(G):                                                  #由图的邻接表转换为邻接矩阵

    g=MatGraph(G.n,G.e)

    g.edges=[[INF]*g.n for i in range(g.n)]

    for i in range(g.n):

        g.edges[i][i]=0

    for i in range(g.n):

        for p in G.adjlist[i]:

            g.edges[i][p.adjvex]=p.weight

    return g



if __name__ == '__main__':

    G=AdjGraph()

    n,e=6,6

    a=[[1,3,1,4,INF,INF],

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

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

    [8,INF,8,8,INF,8],

    [INF,6,6,INF,6,6],

    [INF,INF,9,9,9,9]]

    print()

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

    G.CreateAdjGraph(a,n,e)

    print("  G:")

    G.DispAdjGraph()

    print(" (2)G->g")

    g=AdjToMat(G)

    print("  g:")

    g.DispMatGraph()

    print(" (3)g->G1")

    G1=MatToAdj(g)

    print("  G1:")

    G1.DispAdjGraph()

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

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

相关文章

node.js 入门案例 安装教程

前言 Node.js是一个基于Chrome JavaScript 运行时建立的一个平台。 Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎,V8引擎执行Javascript的速度非常快,性能非常好。 可以让JavaScript在服务器端运行。它具有轻量级、高…

网络安全--内网篇

一、环境 一个简单的域环境,3台机器即可,一个server2012,win7,,win10 二、开始初始的认识内网 在我们日常渗透中,我们进入企业去进行渗透的时候都是处于一个域的环境下,简单来说域一类网络服务而在服务器…

HarmonyOS实战开发-如何实现一个自定义抽奖圆形转盘

介绍 本篇Codelab是基于画布组件、显式动画,实现的一个自定义抽奖圆形转盘。包含如下功能: 通过画布组件Canvas,画出抽奖圆形转盘。通过显式动画启动抽奖功能。通过自定义弹窗弹出抽中的奖品。 相关概念 Stack组件:堆叠容器&am…

JavaScript基础语法–详谈

JavaScript的编写方式 这里小编写一个简单代码,展示JavaScript三种编写方式 HTML代码行内(可以理解为内联样式) a.第一种方式 一个123的网址,通过点击实现浏览器显示welcome字样提升(与浏览器进行交互)…

【AI模型-机器学习工具部署】远程服务器配置Jupyter notebook或jupyter lab服务

随着AI人工智能的崛起,机器学习、深度学习、模型训练等技术也慢慢泛化,java开发有idea,web开发有vscode,那么AI开发神器肯定离不开jupyter lab(基础版jupyter notebook) Jupyter notebook部署 1. 安装jupy…

基于Python实现多功能翻译助手(上)

创建一个支持多种语言翻译并且允许通过文件拖拽来输入文本的Python窗口应用程序是一个相对复杂的任务,涉及到多个库和组件。以下是一个简化的指南,展示如何使用Python的Tkinter库创建GUI窗口,结合Googletrans库进行翻译,以及使用P…

第十四章 MySQL

一、MySQL 1.1 MySql 体系结构 MySQL 架构总共四层,在上图中以虚线作为划分。 1. 最上层的服务并不是 MySQL 独有的,大多数给予网络的客户端/服务器的工具或者服务都有类似的架构。比如:连接处理、授权认证、安全等。 2. 第二层的架构包括…

Python连接MySQL

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、整体思路二、连接流程三、表结构及代码实现 一、整体思路 二、连接流程 三、表结构及代码实现 代码块如下: import pymysqlcon pymysql.connect(h…

websocket 局域网 webrtc 一对一 视频通话的实例

基本介绍 使用websocket来 WebRTC 建立连接时的 数据的传递和交换。 WebRTC 建立连接时,通常需要按照以下顺序执行一些步骤: 1.创建本地 PeerConnection 对象:使用 RTCPeerConnection 构造函数创建本地的 PeerConnection 对象,该…

springboot共享单车系统

摘 要 随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势;对于共享单车管理系统当然也不能排除在外,随着网络技术的不断成熟,带动了共享单车管理系统,它彻底改变了过…

【JavaScript算法】DOM树层级显示

题目描述: 上述表达式的输出结果为 [DIV] [P, SPAN, P, SPAN] [SPAN, SPAN]直接上代码 let tree document.querySelector(".a"); function traverseElRoot(elRoot) {const result [];function traverse(element, level) {if (!result[level]) {resul…

跨境电商IP防关联是什么?有什么作用?

做跨境电商的朋友应该都知道IP防关联这个词,那么为何IP需要防关联呢?今天为大家来解答这个问题。 跨境电商IP防关联是指在跨境电商运营中,通过采取一系列技术手段,确保每个跨境电商账号使用独立的IP地址,以避免账号之间因为IP地址…

博鳌观察|对话百度沈抖:丰富的应用场景是中国AI赶超的最大机会

既要仰望星空,更要脚踏实地。在被巨大的技术风口裹挟了一年多后,我们与大模型的“相处方式”越来越清晰了。 3月28日,在博鳌亚洲论坛2024年年会现场,我们与百度集团执行副总裁、百度智能云事业群总裁沈抖进行了一次深度交流。 在…

智慧公厕厂家如何选择?光明源智能科技打造一流智慧公厕项目

在当今城市化进程中,智慧公厕已经成为提升城市品质、改善市民生活的重要一环。然而,要打造一流的智慧公厕项目,选择合适的厂家显得尤为重要。作为行业领军者,光明源智能科技在智慧公厕领域具有丰富的经验和卓越的技术实力。今天&a…

大数据学习-2024/3/29-oracle使用介绍

在plsql中登录ORACLE数据。 默认用户: 1、sys: 角色:数据库超级管理员账户。 权限:具有最高的权限,可以执行任何操作,包括操作数据字典和控制文件。可以创建和删除数据库对象,授予和回收其他用户…

计算机系统基础 5 物理地址的形成

历史 早期,程序员自己管理主存,通过分解程序并覆盖主存的方式执行程序 取指令和存储操作数所有的地址都是物理地址; 执行速度快,无需进行地址转换; 未采用虚拟存储机制。 1961年有人提出自动执行overlay…

Openfeign

Openfeign 相关扩展 在 2020 以前的 SpringCloud 采用 Ribbon 作为负载均衡,但是 2020 年之后,SpringCloud 吧 Ribbon 移除了,而是使用自己编写的 LoadBalancer 替代. 因此,如果在没有加入 LoadBalancer 依赖的情况下&#xff0c…

linux离线安装maven

一、下载maven 地址:Maven – Download Apache Maven 使用root权限用户登录服务器 cd /opt sudo mkdir maven cd maven 二、上传maven 使用Xftp工具 三、解压并配置环境变量 tar -zxvf tar -zxvf apache-maven-3.9.6-bin.tar.gz cd apache-maven-3.9.6/ 看到解压…

AI智能视频剪辑解决方案,便捷的视频制作体验

在数字化时代,视频内容已成为企业宣传、产品展示、品牌塑造不可或缺的重要载体。然而,传统视频剪辑方式往往耗时耗力,效率低下,无法满足企业快速响应市场变化的需求。美摄科技凭借领先的AI技术,推出了一款全新的AI智能…

游戏本笔记本更换@添加内存条实操示例@DDR5内存条

文章目录 添加内存条的意义准备工具设备拔出电源适配器并关机👺样机 内存条上的金手指安装过程Notes 安装后开机初次开机速度屏幕显示分辨率和闪烁问题检查安装后的效果 添加内存条的意义 参考双通道内存DDR5多通道内存-CSDN博客 准备工具 准备一个质量差不多的螺…