這里介紹圖論(Graph Theory),圖論是計算機科學中非常重要的一部分內容,甚至可以單獨划分成為一個領域。很多人第一次接觸到圖論這個詞,就覺得圖論是研究和圖畫相關的內容。

      
不過當大家真的去學習圖論時,可能大多數人都會失望一下子,因為圖論實際上研究的是由頂點和邊組成的一種數學模型,這種數學模型非常抽象,並且看起來也很枯燥。

雖然圖論看起來很枯燥,但是如果大家真正的深入研究下去,就會發現圖論是一個非常酷的學科。世界中很多的信息之間的聯系,都可以使用圖這種抽象的數學方式來進行表示,如下就是表示互聯網之間關系的連接圖。

通過建造這樣的模型,可以得出很多非常有意思的結論,進而實現更大的目標,創造出更酷的產品當然,要將一個圖的模型,表示成如上圖所示,其實很大程度上是數據可視化帶來的收益從算法的角度來研究圖,還是相對比較枯燥的。
如下,就是一張圖:

對於圖這種數學模型來說,有兩個非常重要的組成部分:(1)頂點(Vertex) (2)邊(Edge) 其中,頂點和頂點之間就是靠邊連接起來的,頂點和邊一起構成了一張圖。
以圖作為模型,來表示真實世界之間的關系,那么可以表示什么樣的關系呢?從表面上看,這種形式好像很簡單,也很枯燥,但是它的內涵卻很豐富,如下:
(1)交通運輸
最典型的莫過於交通運輸,它可以使用圖來表達,如:每個頂點可以是一個城市,每條邊可以是城市之間的道路再擴展一下,每個頂點可以是一個航站樓,每條邊可以是相應的航線,每個頂點可以是港口,每條邊可以是相應的海運線甚至更宏觀的,每個頂點可以是一個星球,每條邊可以是星球之間宇宙飛船飛行的航線,亦或更微觀的,每個頂點可以是城市中的一座樓,每條邊可以是樓和樓之間的街道。如上,都是可以的,這是對於圖來說,最直觀的一種表示方式,但是,其實很多更抽象的數據關系,也可以用圖來表示。
(2)社交網絡
對於社交網絡來說,每個頂點可以表示一個人,每條邊可以表示
人與人之間的關系。這種關系可以是像 FaceBook 這種好友的關
系,也可以是像 Twitter 這種關注的關系。
(3)相似關系   
每個頂點可以表示一部電影,每條邊可以表示兩部電影之間的相似程度
(4)互聯網
互聯網,也可以用圖來表示,每個頂點可以表示一個域名,每條邊可以表示域名之間的跳轉或 每個頂點可以表示一個頁面,每條邊可以表示頁面之間的連接
(5)工作安排
在工作中的工作安排,也可以用圖來表示,每個頂點可以是一個工作內容,每條邊可以是兩個工作內容之間的相關程度,或 先后執行的優先級順序。
(6)腦區活動
像腦區活動的研究這樣更復雜、更專業的領域,也經常用到圖,每個頂點可以是一個腦區,每條邊可以是腦區之間信息的傳遞。
(7)程序狀態執行
在計算機程序中,程序狀態的執行,也可以用圖來表示,每個頂點可以表示一個程序狀態,每條邊可以表示從一種狀態執行到另外一種狀態。對於這種情況,最典型的一個應用就是自動機,包括制作專業的編譯器,甚至是做一個游戲,都可能要設計一個自動機。在這種情況下,或多或少都會使用圖論建模的方法。
圖的分類
使用圖可以表示這么多真實世界中不同事物之間的關系,那么在表示的過程中,圖也會有一些區別,如下:(1)無向圖(Undirected Graph)和有向圖(Directed Graph)所謂無向圖,即 邊是沒有方向的,如:在社交網絡中,每個頂點表示一個人,人與人之間認識,就連接上一條邊,而這個邊是沒有方向的。

所謂有向圖,即 邊是有方向的,如:在自動機中,每個頂點表示一個事件,每條邊表示從一個事件轉移到另一個事件,並且這個轉移是具有方向性的。

顯然,有向圖由於其不對稱性,所以在很多時候,有向圖會涉及到一些相對比較難的算法。其實,無向圖可以看做是一種特殊的有向圖,如下: 兩個頂點之間用一條沒有方向的邊連接在了一起。 

換個角度,可以將一條沒有方向的邊,換成是兩條有方向的邊
 
所以說:無向圖是一種特殊的有向圖
(2)無權圖(Unweighted Graph)和有權圖(Weighted Graph) 所謂權,可以理解成就是一個數值,而無權和有權,即 連接頂點和頂點之間的邊,有沒有一個數值和它對應。對於無權圖來說,如:在社交網絡中,每個頂點表示一個人,每條邊表示兩個人之間是否認識,即 這條邊只表示認識 或不認識的狀態存在與否,而不需要有一個值和它聯系。

而對於有權圖來說,如:在交通運輸中,每個頂點表示一個地點,每條邊表示地點之間的道路。在這種情況下,每條邊可能有一個值來表示兩個地點之間的距離,或運輸費用。

圖的連通性
在之前舉的例子里,圖中的頂點和邊全部都連接在了一起,但事實上,作為一個圖來說,不一定圖中的每一個頂點都要被邊連接起來,這就涉及到了圖的連通性。如下:
 
如上所示,它可以是三個圖,即 有三個部分,但也可以是一個模型中的一個圖,只不過它不是完全連通的,其中有三個連通分量。
  
簡單圖  
簡單圖(Simple Graph),即 不含自環邊和平行邊的圖 
   
在圖論中,存在兩種相對比較特殊的邊:(1)自環邊(self-loop):一個頂點到這個頂點自身的邊 (2)平行邊(parallel-edges):兩個頂點之間存在多條邊相連接。無論是自環邊還是平行邊,在很多時候也是有意義的。最典型的,如:對於交通運輸來說,從 A 城市到 B 城市可能有不止一條路,可能有三條路,在這種情況下,平行邊就非常有意義 但與此同時,自環邊和平行邊,會加大算法設計的難度,而且在很多情況下,我們真正關心的問題,其實是和自環邊 或 平行邊是無關的。最典型的,如:要考察一張圖的連通性,那么自環邊和平行邊都不會改變這張圖的連通性。
所以,大多數情況下,討論的都是簡單圖
