数据结构-邓俊辉视频(Python代码-图Chap6)

1.Vertex.py
顶点类

from enum import Enum

class VStatus(Enum):
    UNDISCOVERED = 0
    DISCOVERED = 1
    VISITED = 2

class Vertex:
    def __init__(self,data = None,inDegree = 0,outDegree = 0,status = VStatus.UNDISCOVERED,dTime = -1,
                 fTime = -1,parent = -1,priority = float('inf')):
        self.data = data
        self.inDegree = inDegree
        self.outDegree = outDegree
        self.dTime = dTime
        self.fTime = fTime
        self.parent = parent
        self.priority = priority
        self.status = status

2.Edge.py
边类

from enum import Enum

class EStatus(Enum):
    UNDETERMINED = 0
    TREE = 1
    CROSS = 2
    FORWARD = 3
    BACKWARD = 4

class Edge:
    def __init__(self,data = None,weight = None,status = EStatus.UNDETERMINED):
        self.data = data
        self.weight = weight
        self.status = status

3.GraghMatrix.py
邻接矩阵

import Chap3.Queque as Queque
import Chap5.Edge as Edge
import Chap5.Vertex as Vertex
class GraghMatrix:
    def __init__(self,V = [],E = []):
        self.V = V
        self.E = E
        self.e = 0
        self.n = 0

    def vertex(self,i):
        return self.V[i].data

    def inDgree(self,i):
        return self.V[i].inDgree

    def outDgree(self,i):
        return self.V[i].outDgree

    def Vstatus(self,i):
        return self.V[i].status

    def dTime(self,i):
        return self.V[i].dTime

    def fTime(self,i):
        return self.V[i].fTime

    def parent(self,i):
        return self.V[i].parent

    def priority(self,i):
        return self.V[i].priority

    def nextBbr(self,i,j):
        j -= 1
        while(j>-1 and (not self.exist(i,j))):
            j -= 1
        return j

    def firstNbr(self,i):
        '''首个邻居'''
        return self.nextBbr(i,self.n)


    def exist(self,i,j):
        return (0<=i) and (i<self.n) and (0<=j) and (j<self.n) and (self.E[i][j] is not None)

    def edge(self,i,j):
        return self.E[i][j].data

    def Estatus(self,i,j):
        return self.E[i][j].status

    def weight(self,i,j):
        return self.E[i][j].weight

    def Einsert(self,edge,w,i,j):
        '''边插入'''
        if self.exist(i,j):
            return
        self.e += 1
        self.E[i][j] = Edge.Edge(edge,w)
        self.V[i].outDegree += 1
        self.V[j].inDegree += 1

    def Eremove(self,i,j):
        eBak = self.edge(i,j)
        del self.E[i][j]
        self.E[i][j] = None
        self.e -= 1
        self.V[i].outDegree -= 1
        self.V[j].inDegree -= 1
        return eBak

    def Vinsert(self,vertex):
        for i in range(self.n):
            self.E[i].append(None)
        self.n += 1
        newE = [None for j in range(self.n)]
        self.E.append(newE)

        newV = Vertex.Vertex(vertex)
        self.V.append(newV)
        return newV

    def Vremove(self,i):
        for j in range(self.n):
            if self.exist(i,j):
                del self.E[i][j]
                self.V[j].inDegree -= 1
        self.E.pop(i)
        self.n -= 1
        for j in range(self.n):
            if self.exist(j,i):
                del self.E[j][i]
                self.E[j].pop(i)
                self.V[j].outDegree -= 1
        vBak = self.vertex(i)
        self.V.pop(i)
        return vBak

    def BDS(self,v,clock=-1):
        Q = Queque.Queque()
        self.V[v].status = Vertex.VStatus.DISCOVERED
        Q.enqueue(v)
        while(Q.size != 0):
            v = Q.dequeue()
            clock += 1
            self.V[v].dTime = clock
            u = self.firstNbr(v)
            while(u>-1):
                us = self.V[u].status
                if us == Vertex.VStatus.UNDISCOVERED:
                    self.V[u].status = Vertex.VStatus.DISCOVERED
                    Q.enqueue(u)
                    self.E[v][u].status = Edge.EStatus.TREE
                    self.V[u].parent = v
                else:
                    self.E[v][u].status = Edge.EStatus.CROSS
                u = self.nextBbr(v, u)
            #print(self.V[v].data)
            self.V[v].status = Vertex.VStatus.VISITED
            
	def reset(self):
        for i in range(self.n):
            self.V[i].status = Vertex.VStatus.UNDISCOVERED
            self.V[i].dTime = -1
            self.V[i].fTime = -1
            self.V[i].parent = -1
            self.V[i].priority = float('inf')
            for j in range(self.n):
                if self.exist(i,j):
                    self.E[i][j].status = Edge.EStatus.UNDETERMINED
                    
    def bfs(self,s):
        self.reset()
        clock = 0
        v = s
        i = 1
        while(True):
            if self.V[v].status == Vertex.VStatus.UNDISCOVERED:
                print("发现%d个连通阈..."%i)
                i += 1
                self.BDS(v,clock)
            v = (v+1) % self.n   #这里太牛了!!
            if v == s:
                break
     #深度优先搜索,回溯的思想,可判别某两个节点间是否包含祖父关系,即两点间是否连通。
     #通过dTime与fTime可知
    def DFS(self,v):
        self.clock += 1
        self.V[v].dTime = self.clock
        self.V[v].status = Vertex.VStatus.DISCOVERED
        print(self.V[v].data)
        u = self.firstNbr(v)
        while(u>-1):
            ustatus = self.V[u].status
            if ustatus == Vertex.VStatus.UNDISCOVERED:
                self.E[v][u].status = Edge.EStatus.TREE
                self.V[u].parent = v
                self.DFS(u)
            elif ustatus == Vertex.VStatus.DISCOVERED:
                self.E[v][u] = Edge.EStatus.BACKWARD
            else:
                if (self.V[v].dTime < self.V[u].dTime):
                    self.E[v][u] = Edge.EStatus.FORWARD
                else:
                    self.E[v][u] = Edge.EStatus.CROSS
            u = self.nextBbr(v,u)
        self.V[v].status = Vertex.VStatus.VISITED
        self.clock += 1
        self.V[v].fTime = self.clock

if __name__ == '__main__':
    G = GraghMatrix()
    G.Vinsert("A")
    G.Vinsert("B")
    G.Vinsert("C")
    G.Vinsert("D")
    G.Vinsert("E")#多加的顶点“E”,发现多个连通阈
    G.Einsert(1, 1, 0, 2)
    G.Einsert(1, 1, 2, 0)
    G.Einsert(1, 1, 1, 0)
    G.Einsert(1, 1, 0, 1)
    G.Einsert(1, 1, 1, 3)
    G.Einsert(1, 1, 3, 1)
    G.Einsert(1, 1, 1, 2)
    G.Einsert(1, 1, 2, 1)
    G.bfs(0)

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值