圖論——圖的基本性質與表示

chengzic1999發表於2020-11-19

圖的基本性質

在這裡插入圖片描述

頂點(vertex)

上圖中黑色的帶數字的點就是頂點,表示某個事物或物件。由於圖的術語沒有標準化,因此,稱頂點為點、節點、結點、端點等都是可以的。叫什麼無所謂,具體代指什麼才是關鍵。

邊(edge)

上圖中頂點之間藍色的線條就是邊,表示頂點之間的邏輯關係,事物與事物之間的關係。

有向/無向圖(Directed Graph/ Undirected Graph)

有向圖和無向圖,兩者的區別在於,有向圖中的邊是有方向性的。(可以把無向圖視為“雙向”的有向圖,構造無向圖用的就是這種方法)

一般到底是有向圖還是無向圖要根據實際情況判斷,比如在A、B兩點之間的一條路,那一定是個無向圖。

權重(weight)

邊的權重(或者稱為權值、開銷、長度等),即每條邊都有與之對應的值。例如當頂點代表某些地點時,兩個頂點間邊的權重可以為兩點的距離。

連通圖/連通分量(connected graph/connected component)

如果在圖G中,任意2個頂點之間都存在路徑,那麼稱G為連通圖(注意是任意兩個頂點)。下圖不是一個連通圖,但如果把下圖看為兩個圖,就是兩個連通圖。

在這裡插入圖片描述

連通分量也叫最(極)大連通子圖,把上圖看為一個整體,它不是一個連通圖,但它有多個連通子圖,0,1,2,3,4頂點構成的子圖就是該圖的最大連通子圖。

注意:對於連通圖來說,它的最大連通子圖就是其本身。

圖的表示

鄰接矩陣

用二維陣列直接儲存。鄰接矩陣版本的圖論演算法實現起來也更容易,因為不存在鄰接表的邊界問題,用於定點數目較小的情況。

鄰接表

儲存示意圖:

有向圖 digraph 表示

在這裡插入圖片描述

無向圖 graph 表示(可理解為雙向有向圖)

在這裡插入圖片描述
struct ENode {
    int dis, to;//權重、指向
    ENode* next = NULL;
    void push(int to, int dis) {
        ENode* p = new ENode;
        p->to = to; p->dis = dis;
        p->next = next;
        next = p;
    }
}head[100];

完整測試:

#include <iostream>
#include <fstream>
using namespace std;
typedef long long LL;

struct ENode {
    int dis, to;//權重、指向
    ENode* next = NULL;
    void push(int to, int dis) {
        ENode* p = new ENode;
        p->to = to; p->dis = dis;
        p->next = next;
        next = p;
    }
}*head;

int main() {
#ifdef LOCAL
    fstream cin("data.in");
#endif // LOCAL
    /*
    5 8
    1 3 4
    2 4 3
    4 5 6
    1 5 7
    3 5 4
    3 4 3
    2 5 6
    4 1 7
    */
    int n, m; //n個定點,m條邊
    cin >> n >> m;
    head = new ENode[n + 1];
    for (int i = 0; i < m; i++) {
        int from, to, dis;
        cin >> from >> to >> dis;
        head[from].push(to, dis);
        //無向圖 
        //head[to].push(from,dis);
    }

    for (int i = 1; i <= n; i++) {
        cout << i;
        ENode* p = head[i].next;
        while (p) {
            if (p)cout << "-->";
            cout << p->to;
            p = p->next;
        }
        cout << endl;
    }

    return 0;
}

相關文章