數據結構-圖的概述
一、基本定義
1、圖:由點集和弧集(或者爲邊集)組成的 數據結構。(弧集或邊集可爲空)
注:弧是有方向的,邊可以看成雙向的弧。
2、有向圖:由點集和弧集的數據結構爲有向圖。
3、無向圖:由點集和邊集的數據結構爲無向圖,無向圖的臨接矩陣爲對稱矩陣。
快速區分圖是否有向:
1、有向圖點的序偶<>表示,無向圖的用()表示。
2、無向圖邊的數目不會大於(點 -1),而有向圖的邊個數可能會大於(點 - 1)個。
4、網:網是弧或者邊帶權值的圖(網是帶權圖)。
5、子圖:若爲子圖,則其點集爲原圖的子集,邊集或者弧集爲原來圖的子集。
6、完全圖:
無向完全圖:邊 = 點×(點 - 1)/2;
有向完全圖:弧 = 點×(點 - 1);
7、稀疏圖與稠密圖:邊或弧e滿足以下要求爲稀疏圖:
e < N×logN
否則爲稠密圖。
8、度:與頂點相關聯的邊的數目,稱爲度;有向圖又分出度和入度。
9、連通圖:任意兩點間有途徑相通(不一定是兩點間的直接相連)
強連通圖:上面的連通圖的概念是相對於無向圖來定義的;對於有向的連通圖,則稱爲強連通圖。
10、(強)連通分量:極大連通子圖稱爲的連通分量
(強)連通圖: 只有一個(強)連通分量,就是它本身;
非(強)連通圖:有 多個連通分量
二、存儲信息
1、鄰接矩陣表示法(數組表示法)
鄰接矩陣的定義:用二維數組存儲點與點之間的關聯關係;用一維來表示點集合。(無權圖用0、 1來表示邊是否存在;有權圖(即網)用權值表示邊的存在,用無窮表示不存在的邊)
注:對於無向圖的鄰接矩陣,它有對稱的特性。
2、鄰接表表示法(鏈式存儲表示法)
採用鏈表的形式,對相關聯的點點間的關係進行明顯的存儲:
下面截了學長PPT裏的圖片(偷懶,不做圖了):
無向圖的表示:
有向圖的表示:
可以看出:1、無向圖裏面可以看出相應點的度
eg:f點的度爲3:分別爲f點到b、c、d。
2、有向圖裏面可以很直觀看相應點的出度,通過表裏的內容,統計出點的入度;
eg:b點的出度爲1; b點的入度爲2 :b點到c, d點到b, a點到b。
此外:還有十字鏈表表示法(主要爲了直觀方便看出有向圖的出入度而設計):主鏈的信息表由三部分組成,分別爲:圖上的點集,入度指針域指向,出度指針域指向;副鏈上的信息表示由四部分組成:前面存儲的是相關點的信息,後面存儲的是入度指針域和出度指針域,當遇到^的時候,結束計數。
三、圖的遍歷
1、對於圖的遍歷由兩種方式:廣度優先法(Depth First Search) 和 深度優先法(Breadth First Search)。
2、簡要的算法思想:
深度優先算法:我們採用棧的思想:
首先將首個節點入棧;棧不空,重複下述步驟:
a、棧頂頂點出棧,如果未訪問,則訪問並置訪問標誌;
b、然後將首節點所有未訪問的鄰接點入棧。
廣度優先算法:我們採用隊列的思想:
首先將首個節點入隊;隊不空,重複下述步驟:
a、隊頭首結點出隊;
b、對首節點的所有鄰接點,如果鄰接點未被訪問,則
訪問鄰接點並置訪問標誌,然後鄰接點入隊。