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()

  • 34
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值