21图结构的基本概念
圖結構的基本概念
圖的定義:用于描述多對多的網狀關系。
由用于表示事物的頂點(vertex)集合V,以及表示事物之間關系的邊(edge)集合E構成
記作G=(V,E)
頂點數目n>0,邊數目m≥0
V:非空有窮頂點(vertex)集
E :V上的頂點對所構成的邊(edge)集
邊的概念:
1.邊---有向邊--------帶有方向的邊。
頂點v和w之間的有向邊表示成<v,w>
v:邊的尾(tail); w:邊的頭(head)
邊是由v射入w的;
w是與v相鄰(adjacent)的頂點(w是v的鄰接點),有向邊也稱弧(arc)。
注意:<v,w>與 <w,v>是不同的邊。
有向邊用帶箭頭的線條表示,箭頭指向邊的頭
2.邊----無向邊-------不帶方向的邊
頂點v和w之間的無向邊表示成(v,w)。
邊是關聯于v和w。而v與w互為鄰接點。
注意:(v,w)與(w,v)表示同一條邊。
無向邊用不帶箭頭的線條表示。
另外:
邊表示頂點間的某種關系:
無向邊:對稱關系(如同志關系)
有向邊:非對稱關系(如領導和被領導關系)
單行道:有向邊;雙行道:無向邊
3.邊----加權邊--------邊附帶一個實數作為權
邊的權可以表示邊的長度、沿著邊旅行所需的費用或時間、工程(輸電線路、通信線路、高速公路等)造價等(這里只研究非負權)。
權又統稱為耗費(cost),俗稱長度(length),但不一定滿足三角不等式(兩邊之和大于第三邊)。
注意:畫圖形時,權標在邊的旁邊。
示例:
圖的圖形表示法(必須遵循以下五點)
1.圓圈表示頂點,線段表示邊
2.無向邊(v,w)不帶箭頭
3.有向邊<v,w>的線段帶箭頭,箭頭指向頂點w
4.加權邊的權標注在邊的旁邊
5.頂點名稱寫在圓圈內,或標注在圓圈旁邊
比如:頂點名稱用大寫字母A,B,C,D…,
或“北京”、“南京”、“上海”等
頂點變量名用小寫字母 v,w,s,…
或v0,v1,…
圖的種類
1.有向圖:邊都有向。
2.無向圖:邊都無向。
4.混和圖:有些邊有向,有些邊無向(可化為有向圖)。
5.簡單圖:無重復邊,無到自身的邊(形如<v,v>的邊)。
注意點:
無向簡單圖:兩個點之間最多只有一條邊 ,而且沒有自環(自回路)。
有向簡單圖:無自環,無重復邊(允許<v,w>和<w,v>同時存在)。
6. 多重圖:無上述限制。
注意點:
無向多重圖:圖中有重復邊;有到自身的邊(環)。
有向多重圖: 圖中允許有兩條<v,w>、<v,w>同時存在;也允許環存在。
7. 加權圖:邊均帶權。
邊權圖稱網(network),非加權圖也稱0/1圖。
邊的權通常不滿足三角不等式 ;“拓撲”結構圖。
重點
圖的相關術語:
1.有向圖的頂點度:
v的出度(out-degree):v射出的邊數(以v為尾)
v的入度(in-degree):射入v的邊數(以v為頭)
v的度(degree):v的出度與入度之和
2.無向圖的頂點度:
v的度(degree):與v關聯的邊數。
注意:
所有頂點的入度之和=出度之和=邊數(有向圖)
所有頂點的度數之和=邊數的兩倍(無向圖)
3.子圖
子圖就是原圖的一部分,由原圖中部分頂點,以及這些頂點之間的一部分邊組成的圖。但必須與原圖的那一部分一模一樣。
4. 路徑和回路
路徑(path) :首尾相接的邊序列。
回路徑(cycle):起點與終點重合的路徑
簡單路徑:邊不重復;
基本路徑:中間無重復頂點。
路徑 (path)(通路):首尾相接的邊序列。
起點和終點:路徑上的兩個端點。
路徑長度(length):路徑上的邊數。
簡單路徑:頂點不重復
回路(cycle)(圈):起點和終點相重合的簡單路徑
加權圖中的加權路徑耗費=路徑上邊耗費之和
5.無向圖的連通性
v與w連通(connected):頂點v到w有路徑,也稱v可到達w。
孤立點:與任何點都不連通
孤懸邊:刪除邊(v,w)后,v或w就變成孤立點。
連通圖(connected graph):任何兩頂點都連通。
連通分量(connected component):極大連通子圖,連通圖只含一個連通分量。(極大指的是在滿足連通的條件下,盡可能多的含有圖中的頂點以及這些頂點之間的邊。)
6.有向圖的連通性
v與w連通(connected):v到頂點w路徑,也稱v可到達w。
強連通圖(strongly connected graph):任何兩點v和w均相互連通。
強連通分量(strongly connected components,或strong components):
極大強連通子圖,強連通圖只含一個強連通分量。
注意:
v和w單向連通:v到w有路徑(v可達w)。
v和w互連通的(雙向連通):v到w,和w到v都有路徑。
強連通的(strong connected):G中任何兩個頂點都互連通。
強連通分量(connected component):G'=(V',E')是G=(V,E)的由V'導出的強連通子圖,而且V-V'中的任何頂點都不與V'中任何頂點雙向連通。
無向連通圖的生成樹(spanning tree):
是圖的一種連通子圖,它含有圖的全部n個頂點,但只含有足以使圖保持連通的n-1條邊。
生成樹也稱支撐樹,生成樹不唯一。
生成森林(spanning forest):無向非連通圖每個連通分量有一棵生成樹,構成圖的生成森林。
圖如何以矩陣形式存儲?--------鄰接矩陣
頂點表示事物,邊表示事物間的關系,對應的關系矩陣。
頂點對應矩陣的行列號,邊對應矩陣元素值。
0/1圖對應的鄰接矩陣是0/1矩陣:頂點v和w之間有邊,矩陣第v行第w列元素值為1;否則為0。
加權圖對應的鄰接矩陣(也稱耗費矩陣)是實數矩陣:對角線元素值均為0;頂點v和w之間有邊,矩陣第v行第w列的元素值為該邊的長度 ;否則為∞。
注意點:無向圖的鄰接矩陣是對稱矩陣。
鄰接矩陣的順序存儲:
因為鄰接矩陣是一個n×n的方陣,所以可采用一般矩陣的存儲方式。
(1)二維數組存儲
最直觀的存儲方式用二維數組(比如a[n][n])存儲稱為圖的鄰接數組(adjacency array)。
優點:可直接從v行w列讀出邊<v,w>信息
缺點:存儲量較大
適用情況:邊數相對較多的有向圖
存儲效率分析:
鄰接數組存儲法(無論是否壓縮)是邊集的一種順序存儲方式。
優點:簡單,極易在圖中查找、插入、刪除一條邊
缺點:存儲n個頂點的圖,要占用O(n2)個存儲單元
(無論圖中實際含多少條邊)
圖的讀入、存儲空間的初始化等需要花費O(n2)個單位時間。
對于邊數m<<n2時的稀疏圖是不經濟的。
存儲稀疏圖最好采用鄰接表法。
鄰接表
概念:頂點v的所有鄰接點組成的表,稱為v的鄰接表L[v],各頂點鄰接表總稱為圖的鄰接表 (adjacency lists),鄰接表采用鏈式存儲(即鄰接鏈表),L[v]中每個結點對應圖中一條邊,稱為邊結點。
對有向圖,若存在邊<v,w>,則w處于L[v]中。
對無向圖,若存在邊(v,w),則w處于L[v]中,同時v也 處于L[w]中。
n個頂點的鄰接鏈表構成一個鏈表組,使用一個表頭指針數組將n個鏈表結合在一起。
鄰接表通常設計成單向鏈表形式,根據需要,也可設計成雙向的、或其他形式的鏈表。
(2)邊結點結構
不同的圖采用不同的邊結點結構
下面分別介紹加權圖和0/1圖的邊結點結構定義形式
(1)加權圖的邊結點類型定義:
含有鄰接點名稱(編號)域、邊的長度(耗費)域和指向下一個邊結點的指針域。
邊結點的類型定義:
typedef struct edge_node
{ int adjacent; // 鄰接點名稱域
cost_type cost; // 邊的耗費域
struct edge_node *next; //指各下一個邊結點
} edge_node, *Eptr;
(2)0/1圖的邊結點類型定義:
含有鄰接點名稱(編號)域和指向下一個邊結點的指針域。
邊結點的類型定義:
typedef struct edge_node
{ int adjacent; // 鄰接點名稱域
struct edge_node *next; //指各下一個邊結點
} edge_node, *Eptr;
(3)鄰接鏈表的表頭結點(頂點結點)結構定義:
含有頂點名稱域和指向鄰接表首結點的指針域。必要時,可增加其他域。
頂點結點的類型定義:
typedef struct edge_node
{ Vname_type name ; //頂點名,用于由號查名
Eptr firstedge ; //鄰接表的首指針
} hnode ;
表頭結點組定義為:
hnode L[n]; //n為具體頂點數
總結
以上是生活随笔為你收集整理的21图结构的基本概念的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ajax异步(客户端测试)
- 下一篇: 2018各银行大额存单利率!银行大额存单