資料結構——圖(1)——圖的簡單介紹
阿新 • • 發佈:2018-11-10
圖的簡介
我們先回顧一下之前介紹的樹的概念,在樹的定義中,每個節點只能有一個父類,並且樹中不能出現有環形。但是你可曾想過,當一棵樹沒有任何規則的時候,會發生什麼嗎?
現在,我們給圖(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):如果圖中的 每個頂點都有一條邊可以直達每個頂點,那麼稱這樣的圖為完全圖。