1. 程式人生 > 實用技巧 >鄰接矩陣&鄰接表

鄰接矩陣&鄰接表

鄰接矩陣

邏輯結構分為兩部分:V和E集合,其中,V是頂點,E是邊。因此,用一個一維陣列存放圖中所有頂點資料;用一個二維陣列存放頂點間關係(邊或弧)的資料,這個二維陣列稱為鄰接矩陣。鄰接矩陣又分為有向圖鄰接矩陣和無向圖鄰接矩陣

​ ————百度百科

定義

  1. 對於無向圖,鄰接矩陣是對稱的,對角線為 0
  2. 無向圖中,任一頂點 i 的度為第 i 列(或第 i 行)所有非零元素的個數,在有向圖中頂點 i 的出度為第 i 行所有非零元素的個數,而入度為第 i 列所有非零元素的個數
  3. 存圖空間為 \(n^2\) , 由於無向圖對稱且對稱軸為 0,僅需 \(n(n-1)/2\)

特點

容易判斷兩個點是否相連,方便求度,但對於一個稀疏圖,空間上會浪費很多,所以要注意資料範圍

int n, m, o[zx][zx];
cin >> n >> m;
for(int i = 1; i <= m; i++){
    cin >> u >> v;
    o[u][v] = 1;
//  o[v][u] = 1; 無向圖,也可以比較一下u v的大小隻存一個三角形的圖  
}

不知道為什麼看到網上的大佬們寫30多行的指標 就很迷,心慌慌

鄰接表

直接舉栗子 o( =∩ω∩= )

4 5 //4個點 5條邊
1 4 9 //點 點 邊權
4 3 8
1 2 5
2 4 6
1 3 7

上面右圖為連結串列表示的鄰接表,是不是看到指標很激動, 下面介紹一下不用指標的鄰接表

使用陣列實現,每個點都存從這個點出發的所有邊,,此時要給每條邊編號,如下圖

​ 這裡用三個陣列記錄(u,v,w)

再用一個數組first存每個頂點其中一條邊的編號(為了方便列舉每個頂點所連的邊),例如1 4 9,表示為first[1] = 1; 若一個點 i 出度為 0,則令first[i] = -1; 在讀入前,先給first陣列初始化為 1;

1 4 9 是以1為起點掃到的第一條邊,next陣列賦值為 -1 , 4 3 8 同理

現在讀入1 2 5, 把 first[1] 更新為 3,讓 next[3] 存原來 first[1] 的值,這樣就能連起來了

不難發現,遍歷頂點1的所有邊就跳來跳去就行了

建表

int n, m, u[zx], v[zx], w[zx], fisrt[zx], next[zx];
cin >> n >> m;
for(int i = 1; i <= n; i++) first[1] = -1;
for(int i = 1; i <= m; i++){
    cin >> u[i] >> v[i] >> w[i];
    next[i] = first[u[i]];
    first[u[i]] = i;
}

遍歷其中一個點 i

int k = first[i];
while(k != -1){
    k = next[k];
    .....
}

遍歷全部

for(int i = 1; i <= n; i++){
    int k = first[i];
    while(k != -1){
        k = next[k];
        .....
    }
}

啊,一個建圖也沒啥好講的,**畢竟都是大佬 **

✿✿ヽ(°▽°)ノ❀