# [資料結構] CH16. Undirected & Directed Graphs
* 在電腦裡面的圖有兩種,一種是**graph**,另一種是**image**。
* Graph: 具有數據的圖表,像樹狀圖一樣,是用於表達資料關係的圖形。
* Image: 圖片、照片等,用於表達真實事物的圖。
* 但其實這沒有很一定,只是要了解所謂的圖不一定就是圖片。
* 而在這裡我們要討論的就是**graph**這種資料結構。
* 一張Graph由節點(vertices)和邊(Edges)的集合所組成。
* 像是樹狀結構,但node和node之間的關係不只有父親和小孩,而是彼此之間任意連接、更加複雜的圖形。
* 樹狀結構也是一種圖。
* Graph的例子:
* 家族關係的祖譜。
* 捷運路線圖。
## Undirected & Directed Graphs
* 圖可以分為無向圖(Undirected Graphs)和有向圖(Directed Graphs)。
```graphviz
digraph mygraph {
subgraph cluster1
{
label = "無向圖"
edge[arrowhead="none"]
a[label="a"]
b[label="b"]
c[label="c"]
d[label="d"]
a -> b;
b -> c;
b -> d;
d -> a;
}
subgraph cluster2
{
label = "有向圖"
a2[label="a"]
b2[label="b"]
c2[label="c"]
d2[label="d"]
a2 -> b2;
b2 -> c2;
b2 -> d2;
d2 -> a2;
}
}
```
* 我們若說一張Graph G由set(V,E)組成,那以上圖為例,V和E分別表示成:
* $𝑉(𝐺) = \left \{a,b,c,d \right \}$
* $E(𝐺) = \left \{(a,b),(b,c),(b,d),(d,a) \right \}$
* 若是無向圖,邊的前後關係可以顛倒。
* 有向圖中,前面的點是出發點。
### 無向圖的名詞解釋
* Adjacent nodes or neighbors
* 每個邊會將兩個點相連,寫作`e=(u,v)`。
* 此時我們說點`u`和點`v`是邊`e`的**end-points**;且他們彼此為**adjacent nodes** 或 **neighbors**。
* Degree of a node
* 點`u`的degree,寫作$deg(𝑢)$,表示所有連接到`u`的邊有幾條。
* 如果`u`的degree=0,我們稱該點為**isolated node**。
* Regular graph
* 若G是一張**regular graph**,表示裡面每個點的degree都一樣。
* Path
* 從點A到點B的路徑,可表示成$P= \left \{ v_0,v_1,v_2...,v_n \right \}$,其中n為該path的長度(length),經過的node數量等於n+1。
* Simple path
* 路徑上所有經過的點都是不同的點,該路徑稱為**simple path**。
* 例外:頭和尾可以是同一個點,即$v_0=v_n$;也就是說,path包含cycle(看下面)。
* Cycle
* 一條頭尾相同的路徑稱為**cycle**。
* **simple cycle**就是除了頭尾以外的點都不同。
* Connected graph
* 一張connected graph裡面的任意兩點$u,v$,我們都可以找到一條path從$u$走到$v$。
* Connected graph裡面不可能有isolated node。
* 若connected graph裡面沒有任何cycle,該圖是一個樹。
* Complete graph
* 所有node彼此之間都有edge連接。
* Complete graph的edge數量為$n*(n-1)/2$,其中$n$為node數量。
* Clique
* 一張graph $G=(V,E)$裡若存在clique,表示存在點集合$C \subseteq V$,且$C$裡面任意兩點都有edge連接。
* 也就是說若子圖(subgraph)為complete graph,又可以稱做clique。
* Loop
* 一條邊若兩個end-point是一樣的點,該edge稱做**loop**。
* $e=(v,v)$
* loop會讓該點的degree+2。
* Multiple edges
* 同樣的兩個點有多條邊連接,那些邊稱做**multiple edges**。
* Multi-graph
* 當graph存在loop或multiple edges,該圖為**multi-graph**。
* Size of a graph
* 一個graph的size表示裡面共有幾條edge。
### 有向圖的名詞解釋
* 其實上面的大部分也都適用於有向圖......只是有幾個要考慮方向性。
* Out-degree of a node
* Out-degree of $u$表示有幾條edge從$u$往外走。
* In-degree of a node
* In-degree of $u$表示有幾條edge從$u$往內走。
* Degree of a node
* out-degree和in-degree的加總。
* 一個loop會讓該點的out-degree和in-degree同時加一。
* Source
* 一個點若為**source**,該點的out-degree大於一,且in-degree為零。
* Sink
* 一個點若為**sink**,該點的in-degree大於一,且out-degree為零。
* Pendant vertex
* **Pendant vertex**表示degree為一的點,也被稱做**leaf vertex**。
* Reachability
* $v$ is reachable from $u$,表示能找到一條路徑從$u$到$v$。
* Parallel/Multiple edges
* 同上面的Multiple edges,但這邊連方向都要一樣。
* Strongly connected directed graph
* Strongly connected directed graph中,任意兩點$u,v$之間都有path,即使$u,v$相反也一樣。
* Weakly connected digraph
* 不管有向圖的方向性時,任意兩點$u,v$之間都有path,該圖為weakly connected digraph。
* Transitive closure
* Transitive closure的圖中,若$u$指向$v$,$u$也指向所有$v$指向的點。
```graphviz
digraph TransitiveClosure {
subgraph cluster1
{
label = "Graph G"
a[label="a"]
b[label="b"]
c[label="c"]
d[label="d"]
a -> b;
b -> c;
c -> d;
}
subgraph cluster2
{
label = "Transitive closure of G"
a2[label="a"]
b2[label="b"]
c2[label="c"]
d2[label="d"]
a2 -> b2;
a2 -> c2;
a2 -> d2;
b2 -> c2;
b2 -> d2;
c2 -> d2;
}
}
```
###### tags: `DS` `note`