作者:whj95
導讀
圖的定義
定義1:
圖由頂點(vertices)和邊(edges)構成
定義2:
有向圖(directed graph)表示爲(a,b),a爲起始點,b爲終止點。值得一提的是,無向圖的表達爲{a,b}.
圖的術語
無向圖
定義1:
在無向圖中,我們把兩個有邊連接起來的端點,兩點彼此稱爲鄰接(adjacent/neighbors),這條邊與他們關聯(connect).
定義2:
給出無向圖中度(degree)的概念,頂點a的度記爲deg(a),表示a點鄰接的邊數。
注:1個環(loop)貢獻2個度。
定理1:
握手定理:簡而言之,即總度=總邊數*2。很容易理解,1條邊必然對2個頂點各有貢獻1個度(包括自環)。
定理2:
簡而證之,由於定理1,總度必爲偶數,所以奇數度頂點必有偶數個。
有向圖
定義1:
注意此處開始有順序,鄰接分爲鄰接到(adjacent to)和從…鄰接(adjacent from)。我們將首尾的兩點分別稱爲:起點(initial vertex),終點(terminal/end vertex)。
定義2:
介紹入度(deg
注意: deg
定理1:
入度=出度=總邊數。
簡單理解:“收支平衡的月光族”
圖的表示
圈圖/C圖
圈圖(circle)。相鄰邊相接,示例如下:
星圖/S圖
星圖(star)。有一箇中心點與所有的點連接,而其他點各不相連,示例如下:
輪圖/W圖
輪圖(wheel)。圈圖+星圖(圈圖和星圖的並運算),示例如下:
完全圖/K圖
完全圖(complete)。每個點與其他所有點都相連,示例如下:
注:無向完全圖的邊數爲C
二部圖/偶圖
定義:
二部圖(bipartite)即爲每條邊的兩個端點必須分別坐落在兩個不同的集合(紅方 藍方)裏。所以,可用紅藍染色法(相鄰頂點顏色不同即二部圖,否則不是)來檢測一個圖是否爲二部圖。
完全二部圖
完全二部圖(complete bipartite)定義簡述爲:二部圖中兩集合中的元素滿射。
如下圖所示 K2,3, K3,3, K3,5, and K2,6即爲完全二部圖:
子圖 生成子圖 導出子圖 主子圖
如下圖所示,G1是G的生成子圖(保留所有頂點即可),G2是G的導出子圖(induced subgraph,選出部分頂點及其所有互聯邊),G3是G的主子圖(主圖-除去部分頂點及其所有互聯邊)。
並運算
沒什麼好說的,並運算的延伸而已。
圖的同構
鄰接表 (adjacency list)
鄰接矩陣 (adjacency matrix)
關係矩陣 (incidence matrix)
同構 (isomorphism)
①首先是否有相同的邊、相同的頂點數、各頂點的度。都符合則跳至②,否則不是同構;②檢查某些點是否相連,比如度均爲2的點是否連接。如圖不是同構,因爲G中度3與度2相連,H中度3與度3相連:
連通性 connectivity
基本概念
通路 (path):若干點的連線
長度 (length):邊的數目
迴路 (circuit):頭尾點相同
①簡單(simple)的定義:通路中沒有經過重複邊和自環
跡 (trail):簡單 path
②基本的定義:通路中沒有經過重複點
環 (cycle): 基本 circuit(除了頭尾相等)
無向圖的連通性
連通性 (connected)
連通分支 (connected component):無公共點的若干個連通子圖的並
割點 (cut vertex):除去一個點及與這點有關的所有邊,能把連通圖切爲若干連通分支
割邊/橋 (cut edge/bridge):除去一條邊,能把連通圖切爲若干連通分支
有向圖的連通性
強連通 (strongly connected):每個點互相都能到達(雙向通路可以間接到達)
弱連通 (weakly connected):不考慮方向,到達即可
G是強連通,因爲處處互相都能連通;H是弱連通,因爲考慮有向無法處處到達,無向纔可以。
計算通路數:貼個例題就好:
歐拉通路及漢密爾頓通路
歐拉通路與歐拉回路
無向歐拉
歐拉回路 (Euler circuit):歐拉+簡單迴路 走完所有的邊不重複並返回起點
歐拉通路 (Euler path):歐拉+簡單通路 走完所有的邊不重複。例題:
歐拉回路充要條件:所有點都是偶數度
歐拉通路充要條件:有且僅有 2個點爲 奇數度,且必須以奇數度作爲端點出發
有向歐拉
歐拉回路充要條件:所有點都是入度=出度
歐拉通路充要條件:1個點入度<出度,1個點入度>出度,其他點入度=出度。來個例子:
de Bruijn Cycles
這部分略去。
漢密爾頓通路與漢密爾頓迴路
漢密爾頓迴路 (Hamilton circuit):漢密爾頓+基本回路 走完所有的點不重複並返回起點
漢密爾頓通路 (Hamilton path):漢密爾頓+基本通路 走完所有的點不重複。例題:
簡單判定規律
①存在 度= 1 無漢密爾頓迴路
②2度頂點的兩條邊屬於任意漢密爾頓迴路
③n>=3時,完全圖均有漢密爾頓迴路
漢密爾頓迴路充分條件(不滿足也有可能是漢密爾頓迴路)
①狄拉克、奧爾定理(Dirac’s/Ore’s theorem):
②
③完全二部圖K(n,n)上下端點相等則有漢密爾頓迴路
漢密爾頓通路充分條件
①
最短通路
帶權圖:每條edge都附上了“權”的色彩,長度length≠邊數和,而是=權和。
狄克斯特拉算法 (Dijkstra’s Algorithm)
①選擇 定點 v1=0,其他頂點爲∞
②與這個頂點的有關邊全部走過,並在所有終端點處記下總通路(v1到此終端點)的權和,更新最小值
③沿最短路徑移動定點,重複②
具體算法借用數據結構中的例子,以C語言爲例:
/*
測試數據 教科書 P189 G6 的鄰接矩陣 其中 數字 1000000 代表無窮大
6
1000000 1000000 10 100000 30 100
1000000 1000000 5 1000000 1000000 1000000
1000000 1000000 1000000 50 1000000 1000000
1000000 1000000 1000000 1000000 1000000 10
1000000 1000000 1000000 20 1000000 60
1000000 1000000 1000000 1000000 1000000 1000000
結果:
D[0] D[1] D[2] D[3] D[4] D[5]
0 1000000 10 50 30 60
*/
#include <iostream>
#include <cstdio>
#define MAX 1000000
using namespace std;
int arcs[10][10];//鄰接矩陣
int D[10];//保存最短路徑長度
int p[10][10];//路徑
int final[10];//若final[i] = 1則說明 頂點vi已在集合S中
int n = 0;//頂點個數
int v0 = 0;//源點
int v,w;
void ShortestPath_DIJ()
{
for (v = 0; v < n; v++) //循環 初始化
{
final[v] = 0;
D[v] = arcs[v0][v];
for (w = 0; w < n; w++)
p[v][w] = 0;//設空路徑
if (D[v] < MAX)
{
p[v][v0] = 1;
p[v][v] = 1;
}
}
D[v0] = 0;
final[v0]=0; //初始化 v0頂點屬於集合S
//開始主循環 每次求得v0到某個頂點v的最短路徑 並加v到集合S中
for (int i = 1; i < n; i++)
{
int min = MAX;
for (w = 0; w < n; w++)
{
//我認爲的核心過程--選點
if (!final[w]) //如果w頂點在V-S中
{
//這個過程最終選出的點 應該是選出當前V-S中與S有關聯邊
//且權值最小的頂點 書上描述爲 當前離V0最近的點
if (D[w] < min)
{
v = w;
min = D[w];
}
}
}
final[v] = 1; //選出該點後加入到合集S中
for (w = 0; w < n; w++)//更新當前最短路徑和距離
{
/*在此循環中 v爲當前剛選入集合S中的點
則以點V爲中間點 考察 d0v+dvw 是否小於 D[w] 如果小於 則更新
比如加進點 3 則若要考察 D[5] 是否要更新 就 判斷 d(v0-v3) + d(v3-v5) 的和是否小於D[5]
*/
if (!final[w] && (min+arcs[v][w]<D[w]))
{
D[w] = min + arcs[v][w];
// p[w] = p[v];
p[w][w] = 1; //p[w] = p[v] + [w]
}
}
}
}
int main()
{
cin >> n;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
cin >> arcs[i][j];
}
}
ShortestPath_DIJ();
for (int i = 0; i < n; i++)
printf("D[%d] = %d\n",i,D[i]);
return 0;
}
距離矩陣 (distance matrix):行爲起始點,列爲終端點,有通路的賦權值,無通路的爲∞。尋找最短路徑用的仍是狄克斯特拉算法①尋找定點v1(即第一行);②然後選擇最短路徑(下圖爲25),記下終端點作爲新定點(下圖爲v5即第五行),並通過定點與該行所有元素累加(即走過所有有關邊)時時更新最短路徑和;③重複②直到所有終端點都遍歷 。一發例子如下:
Warshall-Floyd theorem
①第一行第一列 第二行第二列….以此類推畫出基準
②忽略其中的無窮項,根據基準權和小的取代權和大的
③選取方法爲行選一個列選一個加和,然後行列同時後(下)移一位繼續,直至選完
例子:
可平面圖
定義:一個圖如果各邊除了端點外沒有其他交點,則可平面(planar)
判定方法:先假設可平面。選取幾個點畫出可平面圖形,然後分割出區域餘下的點分別嘗試放入不同的區域,看看最後會不會引起矛盾。來發例子:
歐拉公式: v+r = e+2(面+點=邊+2)
推論1:
證明爲引入面次數的概念,一個面至少有3次,2e =
注:不滿足一定不可平面,滿足不一定可平面
推論2:
證明爲推論1+握手定理
推論3:
與1相比實則蘊含v≥4的條件,可證明K3,3不可平面
庫拉圖斯基定理 (Kuratowski’s Theorem)
理論基礎:若該圖子圖包含K3,3,K5及其同構則一定不可平面
初等細分( elementary subdivison):刪除一條邊,添加新頂點與刪除邊的端點各自連接,不改變可平面性
通過引入細分概念尋找同胚圖( homeomorphic),引用2個例子:
注:若頂點deg=4,嘗試轉化爲K5;若deg=3,嘗試轉化爲K3,3
圖着色
色數 (chrometic number):所有頂點染色(相鄰點顏色不同)所需要的最小顏色數
不同圖所需色數:
①Kn圖,n種(顯而易見)
②Km,n圖,2種(二部圖的標誌)
③Cn圖,當n爲偶數 ,2種(舉例即可顯而易見)
當n爲奇數 ,3種