1. 程式人生 > >資料結構——圖(1)——圖的簡單介紹

資料結構——圖(1)——圖的簡單介紹

圖的簡介

我們先回顧一下之前介紹的樹的概念,在樹的定義中,每個節點只能有一個父類,並且樹中不能出現有環形。但是你可曾想過,當一棵樹沒有任何規則的時候,會發生什麼嗎?
現在,我們給圖(graph)下一個定義:
圖,是一種用節點和邊來表示相互關係的數學模型。(A graph is a mathematical structure for representing relationships using nodes and edges)
其實,用句不是很嚴謹的話來說,圖可以看成是沒有任何限制的樹(比如,可以有環狀,可以有多種關係等等)。
下圖是圖但它們不是一棵樹:
這裡寫圖片描述
這裡寫圖片描述
從圖二中我們也可以看出,圖沒有固定的root。

圖的基本結構

我們剛剛說了,圖是由一系列的節點通過一系列的邊連線在一起的,所以大體的圖的資料結構可以為:

struct Graph{
    set<Node *> nodes;
    set<Edge*> edges;
};

而具體的節點和邊我們可以這樣表示:

struct Node{ //節點的資料結構
    string value; //節點中的數值
    vector<Edge *> edges;//連線該節點的邊
};
struct Edge{//邊的資料結構
    Node * start;//邊的起點
    Node * end;//邊的終點
};

我們經常在圖的邊上新增一些數值,成為邊的權重,用weight表示,於是我們的邊上的資料結構也可以這樣定義為:

struct Edge{
    Node * start;//邊的起點
    Node * end;//邊的終點
    double weight; //權
};

與圖相關的一些概念

有向圖與無向圖

在離散數學課程中,我們學過圖這個基本的數學結構還有它的一些概念,現在回顧一下:
這裡寫圖片描述
下圖中,每個表情可以看做是一個節點(也常稱為頂點),而黑色的線將每個節點連線起來,稱為邊。
如圖中的每一條邊,如果有表明方向,有起點終點,這樣的圖我們稱為有向圖Directed Graph

即有方向的圖)
這裡寫圖片描述
相反如果圖中的邊沒有方向性,那麼我們就稱這樣的圖為無向圖Undirected Graph即沒有方向的圖)
這裡寫圖片描述
下圖就是有向圖跟無向圖的區別
這裡寫圖片描述

權重與權重圖

權重:與給定邊之間的相關的成本。
例如航空公司航班圖表,按城市之間的里程加權:
這裡寫圖片描述

先決條件圖

顧名思義,前面的事物要建立在後面的基礎上
這裡寫圖片描述

與圖相關的一些術語

下面看一副圖
這裡寫圖片描述

  • 路徑(path):從某個頂點到另一個頂點之間的路徑,可以用經過的點或者經過的邊來表示。例如從V到Z,所經過的路徑可以表示為:
    {b, h} 或者{V, X, Z}
  • 路徑長度(path length):路徑中包含的節點數或者邊的數量
  • 鄰居(neighbor):通過一條邊直接相連的兩個節點,稱為鄰居,例如圖中的V和X
  • 環(cycle):路徑的起點跟終點都是在同一個節點中的路徑。例如(紅色線條)和藍色線條
    路徑:{b, g, f, c, a} 或者 {V, X, Y, W, U, V},還有 .{c, d, a} 或者{U, W, V, U}.
    這裡寫圖片描述
  • 無環圖:圖中不包含任何的環狀的圖
  • 迴圈(loop):連線自身頂點的邊。許多圖中是不允許包含有迴圈的
    這裡寫圖片描述
  • 可達(reachable):如果存在一條路徑,使得a能夠到達b,就稱a到b可達
  • 連通(connect):如果圖中每一個頂點都能相互可達,那麼我們就稱這圖是連通的,稱為連通圖
  • 完全圖(complete):如果圖中的 每個頂點都有一條邊可以直達每個頂點,那麼稱這樣的圖為完全圖。
    這裡寫圖片描述