1. 程式人生 > 其它 >習題18-1 用連結串列來實現鄰接表

習題18-1 用連結串列來實現鄰接表

一、儲存鄰接表的兩種方式

1、vector儲存法

vector<int> edge[N]

2、鏈式前向星

鏈式前向星是鄰接表存圖的第二種,一般遍歷的圖比較大的時候可以用,比用向量存圖的那種鄰接表要快。

它是一種以邊為主的存圖方式,下面我會對其進行介紹:\(idx\)表示邊的位置, \(h[i]\)表示以\(i\)為起點第一條邊的位置,\(e[i]\)表示以\(i\)這條邊的終點,\(w[i]\)表示\(i\)這條邊的權值,\(ne[i]\)表示以這條邊同起點下一條邊的位置。

二、鏈式前向星程式碼

#include <bits/stdc++.h>

using namespace std;

//用連結串列來代替vector實現鄰接表 (用陣列來模擬儲存連結串列) 拉鍊法的HASH表
const int N = 1010;  //結點個數
int h[N];            //h[N]表示有N條單鏈表的頭
int e[N << 1];       //e[N<<1]代表每個節點的值 連結串列記錄的是關係
int ne[N << 1];      //ne[N<<1]代表每個節點的下一個節點號 連結串列記錄的是關係
int idx;             //結點編號
int w[N << 1];       //邊的權值
//一般認為N<<1就夠用了,就是2*N個大小

// 新增一條邊a->b (頭插法),邊權值是val
void add(int a, int b, int val) {//有的時候可以不用建立權值
    e[idx] = b, ne[idx] = h[a], w[idx] = val, h[a] = idx++;
    // https://www.acwing.com/video/21/ yxc老師的講解頭插法
    // ne[idx]=h[a]的意義:將原來h[a]是指向第一個子結點的,現在,記錄idx的下一個結點是原來的第一個節點,它現在是第一個了,
    // 原來的第一個是第二個了。
    // h[a]=idx++的意義: a這個結點的第一個子結點是idx了,然後再把 idx增加1個!方便下次加入新結點
}

int main() {
    //給定初始值
    memset(h, -1, sizeof h);
    /* 遍歷以u為出發點的連結串列辦法
    for(int i=1;i<=n;i++){  //n個點
        for (int j = h[u]; j != -1; j = ne[j]) {//遍歷以i為起點的所有邊

        }
    }
    其實鏈式前向星也是列舉每個起點的所有邊,只不過它是以邊進行建圖的
    */
    return 0;
}