數據結構之圖的代碼實現(使用Python實現)


圖的數據結構Python代碼實現

使用鄰接列表實現.

鄰接表理論介紹 : 數據結構(八):鄰接表與鄰接矩陣

代碼數據結構圖示

數據結構文字描述

    Graph().vertList : {

                key:Vertext(){

                    self.id = key
                    self.connectedTo{
                        相鄰節點類實例 : 權重
                        ..
                        ..
                    }

                },
                
                key2:Vertext(){

                    self.id = key
                    self.connectedTo{
                        相鄰節點類實例 : 權重
                        ..
                        ..
                    }
                    
                }
                ..

        }




代碼實現

class Vertext(): # 包含了頂點信息,以及頂點連接邊

    def __init__(self,key):#key表示是添加的頂點
        self.id = key
        self.connectedTo = {} # 初始化臨接列表

    def addNeighbor(self,nbr,weight=0):# 這個是賦值權重的函數
        self.connectedTo[nbr] = weight

    
    def __str__(self):
        return str(self.id)+ ' connectedTo: '+str([x.id for x in self.connectedTo])
    
    def getConnections(self): #得到這個頂點所連接的其他的所有的頂點 (keys類型是class)
        return self.connectedTo.keys()
    
    def getId(self): # 返回自己的key
        return self.id
    
    def getWeight(self,nbr):#返回所連接ner頂點的權重是多少
        return self.connectedTo[nbr]

'''
Graph包含了所有的頂點
包含了一個主表(臨接列表)
'''
class Graph():# 圖 => 由頂點所構成的圖

    '''
    存儲圖的方式是用鄰接表實現的.

    數據結構: {
                key:Vertext(){
                    self.id = key
                    self.connectedTo{
                        相鄰節點類實例 : 權重
                        ..
                        ..
                    }
                }
                ..
                ..
        }


    '''
    def __init__(self):
        self.vertList = {} # 臨接列表
        self.numVertices = 0 # 頂點個數初始化
    
    def addVertex(self,key):# 添加頂點
        self.numVertices = self.numVertices + 1 # 頂點個數累加
        newVertex = Vertext(key) # 創建一個頂點的臨接矩陣
        self.vertList[key] = newVertex
        return newVertex
    
    def getVertex(self,n):# 通過key查找定點
        if n in self.vertList:
            return self.vertList[n]
        else:
            return None
    
    def __contains__(self,n):# transition:包含 => 返回所查詢頂點是否存在於圖中
        #print( 6 in g)
        return n in self.vertList
    
    def addEdge(self,f,t,cost=0): # 添加一條邊.
        if f not in self.vertList: # 如果沒有邊,就創建一條邊
            nv = self.addVertex(f)
        if t not in self.vertList:# 如果沒有邊,就創建一條邊
            nv = self.addVertex(t)
        
        if cost == 0:# cost == 0 代表是沒有傳入參數,而使用的默認參數0,即是是無向圖
            self.vertList[f].addNeighbor(self.vertList[t],cost) # cost是權重.無向圖為0
            self.vertList[t].addNeighbor(self.vertList[f],cost)
        else:#
            self.vertList[f].addNeighbor(self.vertList[t],cost) # cost是權重
        

    def getVertices(self):# 返回圖中所有的定點
        return self.vertList.keys()
    
    def __iter__(self): #return => 把頂點一個一個的迭代取出.
        return iter(self.vertList.values())


#
# -------------------------------------------------
# 以下是測試數據.可刪除
# -------------------------------------------------
#
g = Graph()

# for i in range(6):
#     g.addVertex(i)
# print(g.vertList)

'''
# a = g.vertList[0]
# print(a.connectedTo)
'''




g.addEdge(0,5,2)
g.addEdge(1,2,4)
g.addEdge(2,3,9)
g.addEdge(3,4,7)
g.addEdge(3,5,3)
g.addEdge(4,0,1)
g.addEdge(5,4,8)
g.addEdge(5,2,1)

print(g.getVertices())
# vertList = { key :VertextObject}
# VertextObject =  ||key = key, connectedTo = {到達節點:權重}||   => |||| 表示的是權重的意思

# print(g)
for v in g: # 循環類實例 => return ->  g = VertextObject的集合  v = VertextObject
    for w in v.getConnections(): # 獲得類實例的connectedTO
        # print(w)
        print("({},{}:{})".format(v.getId(),w.getId(),v.getWeight(w))) ## 為什么會是這樣 => 因為這個時候v就是class啊


參考


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM