原文連結:https://blog.csdn.net/weixin_41883890/article/details/125517599
本文介紹C#實現圖的鄰接矩陣和鄰接表結構。
邏輯結構分為兩部分:V和E集合,其中,V是頂點,E是邊。因此,用一個一維陣列存放圖中所有頂點資料;用一個二維陣列存放頂點間關係(邊或弧)的資料,這個二維陣列稱為鄰接矩陣。鄰接矩陣又分為有向圖鄰接矩陣和無向圖鄰接矩陣
鄰接矩陣(Adjacency Matrix)是表示頂點之間相鄰關係的矩陣。設G=(V,E)是一個圖,其中V={v1,v2,…,vn} [1] 。G的鄰接矩陣是一個具有下列性質的n階方陣:
①對無向圖而言,鄰接矩陣一定是對稱的,而且主對角線一定為零(在此僅討論無向簡單圖),副對角線不一定為0,有向圖則不一定如此。
②在無向圖中,任一頂點i的度為第i列(或第i行)所有非零元素的個數,在有向圖中頂點i的出度為第i行所有非零元素的個數,而入度為第i列所有非零元素的個數。
③用鄰接矩陣法表示圖共需要n^2個空間,由於無向圖的鄰接矩陣一定具有對稱關係,所以扣除對角線為零外,僅需要儲存上三角形或下三角形的資料即可,因此僅需要n(n-1)/2個空間。
鄰接表,儲存方法跟樹的孩子連結串列示法相類似,是一種順序分配和鏈式分配相結合的儲存結構。如這個表頭結點所對應的頂點存在相鄰頂點,則把相鄰頂點依次存放於表頭結點所指向的單向連結串列中。
對於無向圖來說,使用鄰接表進行儲存也會出現資料冗餘,表頭結點A所指連結串列中存在一個指向C的表結點的同時,表頭結點C所指連結串列也會存在一個指向A的表結點。 [1]
程式:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 圖的儲存結構 { using VertexType = System.Char;//頂點資料型別別名宣告 using EdgeType = System.Int16;//帶權圖中邊上權值的資料型別別名宣告 class Program { public const int MAxVertexNum =100;//頂點數目的最大值 static void Main(string[] args) { } /// <summary> /// 圖的定義--鄰接矩陣 /// </summary> public struct MGraph { public VertexType[] vex;//頂點表陣列 public EdgeType[][] Edge;//臨接矩陣、邊表 public int vexnum,arcnum;//圖的當前頂點數和弧數 } /// <summary> /// 圖的定義--鄰接表法 /// </summary> public class ArcNode {//邊表節點 public int adjvex; public ArcNode next; } public class VNode { //頂點表節點 VertexType data;//頂點資訊 ArcNode first;//只想第一條依附改頂點的弧的指標 } public class ALGraph { VNode[] vertices; //鄰接表 int vexnum, arcnum;//圖的頂點數和弧數 } }
}