C#實現圖的鄰接矩陣和鄰接表結構

yinghualeihenmei發表於2024-03-14

原文連結: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;//圖的頂點數和弧數
    }
}
}

  

相關文章