學習數據結構--第五章:圖(圖的基本操作)

第五章:圖(圖的基本操作)

1.Adjacent(G,x,y)

Adjacent(G,x,y) 判斷圖G是否存在邊<x,y>(x,y)

如上 無向圖 的鄰接矩陣和鄰接表表示方法,判斷方法分別爲:

  • 鄰接矩陣:判斷該邊是否存在直接判斷對應鄰接矩陣中的值即可,如果是1存在否則不存在
  • 鄰接表:判斷對應頂點的邊表是否存在這樣一條邊的邊表結點

因爲無向圖的鄰接矩陣和鄰接表我們會存儲兩遍,所以無論第一個結點x做行號,還是y做行號都可以進行查找

如上 有向圖 的鄰接矩陣和鄰接表表示方法,判斷方法分別爲:

  • 鄰接矩陣:判斷該邊是否存在直接判斷對應A[x][y]鄰接矩陣中的值即可,如果是1存在否則不存在
  • 鄰接表:判斷第一個端點x對應的頂點的邊表是否存在這樣一條邊的表結點

因爲是有向圖所以每個對於鄰接矩陣和鄰接表都只會存儲一此,所以傳入的參數第一個x爲邊的起點的下標

2.Neighbors(G,x)

Neighbors(G,x)列出圖G中與結點x(頂點)鄰接的邊

如上 無向圖 列出對應結點鄰接邊

  • 鄰接矩陣:直接搜索鄰接矩陣中該頂點的 行或列 中值爲1的,值爲1都代表某一個邊的存在
  • 鄰接表:遍歷對於頂點的邊表,所有邊表結點都代表一個鄰接的邊

如上 有向圖 列出對應結點鄰接邊

  • 鄰接矩陣:我們需要遍歷該頂點對應的 行和列 中值爲1的,值爲1都代表某一個邊的存在(行代表出邊,列代表入邊)
  • 鄰接表:首先遍歷對應頂點的邊表,找到所有的以該頂點爲頭節點的邊(出邊),然後遍歷整個鄰接表找到以該頂點爲尾結點的邊(入邊)

3.InsertVertex(G,x)

InsertVertex(G,x) 在圖G中插入頂點x

其實關於插入頂點有向圖和無向圖差不多,這裏我們要插入一個頂點F

無向圖:首先我們需要將頂點F插入到頂點表中,頂點表是一個數組無法擴充所以我們需要新建立一個數組把之前的頂點插入進來,然後加上頂點F,接着我們需要修改鄰接矩陣,我們依舊需要擴充二維數組(同樣創建一個二維數組把舊的值和新的值都添加進去)。這裏只是插入一個頂點,並未確定連接關係

有向圖:同樣我們新建立一個頂點表,將舊值和新值都添加進去,邊表置爲空即可

4.DeleteVertex(G,x)

DeleteVertex(G,x)從圖G中刪除頂點x

刪除一個頂點還需要刪除與該頂點有關所有的邊

  • 鄰接矩陣:將頂點表對應的結點的值設爲空,矩陣二維數組該頂點對應的行和列設爲空,所以我們有時也可以採用縮小數組來刪除結點。
  • 鄰接表:我們需要刪除頂點表對應的頂點,接着清空該頂點表對應的邊表

5.AddEdge(G,x,y)

AddEdge(G,x,y)若無向邊(x,y)或者有向邊<x,y>不存在,則向圖G中添加該邊

如上無向圖 添加一條邊

  • 鄰接矩陣:添加一條邊,我們需要修改該邊在矩陣中的值爲1,例如增加AD邊,我們需要修改A[0][3]=1A[3][0]=1
  • 鄰接表:添加一條邊,我們需要在兩個頂點對應的邊表中分別增加彼此結點

6.RemoveEdge(G,x,y)

RemoveEdge(G,x,y) 若無向邊(x,y)或者有向邊<x,y>存在,則在圖G中刪除該邊

如上無向圖 刪除一條邊

  • 鄰接矩陣:刪除一條邊,則需要修改該邊對應的值爲0,例如刪除BC邊,我們需要修改A[1][2]=0A[2][1]=0
  • 鄰接表:刪除一條邊,則需要刪除兩個頂點對應邊表中的彼此結點

7.XxxxNeighbor(G,x)

FirstNeighbor(G,x) 求圖G中頂點x的第一個鄰接點,若有則返回頂點號。若沒有鄰接點或者圖不存在x,則返回-1

NextNeighbor(G,x) 假設圖G中頂點y是頂點x的一個鄰接點,返回除y之外頂點x的下一個鄰接點的頂點號,若y是x的最後一個鄰接點,則返回-1

例如我們找B頂點的

  • FirstNeighbor(G,x)第一個鄰接點
    • 鄰接矩陣:我們按照鄰接矩陣順序查找,搜索B對應的行,我們發現這一行第一個值不爲1的點爲它的第一個鄰接點爲A(即對應列號較小且值爲1的結點)
    • 鄰接表:遍歷對應頂點的邊表,第一個結點即爲它的第一個鄰接點
  • NextNeighbor(G,x) 下一個鄰接點
    • 鄰接矩陣:同理我們按照上面的規律繼續往後查找,找到下一個值爲1的即爲它的下一個鄰接點
    • 鄰接表:遍歷對應頂點的邊表,第一個結點的下一個結點即爲它的下一個鄰接點

8.Xxx_edge_value(G,x,y)

我們知道當邊有權值時的圖我們叫做網,對於網我們有獲取和設置該邊權值的操作

Get_edge_value(G,x,y) 獲取圖G中邊(x,y)或<x,y>對應的權值 v

Set_edge_value(G,x,y) 設置圖G中邊(x,y)或<x,y>對應的權值 v

  • 獲取邊的權值
    • 鄰接矩陣:直接找到該邊對應的二維數組的值即爲該邊的權重
    • 鄰接表:遍歷鄰接矩陣找到對應結點的存儲的權重
  • 設置邊的權值
    • 鄰接表矩陣:同理
    • 鄰接表:同理

7.理木客

數據結構相關知識,公衆號理木客同步更新中,歡迎關注

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章