# 基本圖論 ## 圖論名詞介紹 ### 圖 (Graph) / 節點 (Vertex) / 邊 (Edge) - 圖(`Graph`):一種由「節點(頂點,`Vertex`, `plural: Vertices`)」與「邊(`Edge`)」組成的結構,用以描述「關係」或「連結」。 - 記號:常寫作 \( G = (V, E) \),其中 - \( V \):節點集合 - \( E \):邊集合(每一條邊連結 1 或 2 個節點,依有向/無向而定) - 節點(`Vertex`):圖的基本單位,可以代表人、城市、伺服器、檔案、網頁等。 - 邊(`Edge`):連結節點與節點之間的關係或互動,可以代表道路、好友關係、流量、依賴性等。 ![image](https://hackmd.io/_uploads/H1npJp9nxg.png) #### 生活中的例子 - 圖 - 社群網路:節點=使用者,邊=互為好友(無向)或「追蹤」(有向)。 - 道路地圖:節點=路口,邊=道路(可帶距離或時間作為邊權)。 - 檔案依賴:節點=模組,邊=依賴關係(常為有向)。 - 網頁連結:節點=網頁,邊=超連結(有向)。 - 電路連線、組織架構、流程節點等也可建模為圖。 ![image](https://hackmd.io/_uploads/SJ79y6qnle.png) --- ### 有向圖 / 無向圖 - 無向圖(`Undirected Graph`):邊 (u, v) 無方向,表示「對稱關係」。好友、雙向管線、無向連線等。 - 有向圖(`Directed Graph / Digraph`):邊 <u, v> 有方向,表示「由 u 指向 v」。關注、單向管制、資料流、依賴順序等。 - 混合圖:同時存在有向與無向邊(可以先不要理他,暫時遇不到)。 - 自迴圈(`Self Loop`):由節點指向自身的邊(u, u)。 - 重邊(`Multi-Edge`):兩節點間有多條邊(可能代表多種不同型態的連結),簡單圖(Simple Graph)中不允許重邊與自迴圈。 ![image](https://hackmd.io/_uploads/Sk7glp9nxg.png) #### 生活中的例子 - 有向圖(?) - `Instagram`:A 追蹤 B 不代表 B 一定追蹤 A → 有向。 - 物流流向:倉庫 A 發貨到門市 B。 - 任務依賴:任務 A 必須在任務 B 前完成(A → B)。 --- ### 圖上的資訊 - 結構資訊:哪兩個節點相連。 - 額外屬性: - 邊權(`Edge Weight`) - 點權(`Node / Vertex Weight`) - 標籤(`Label`)、容量(`Capacity`)、流量(`Flow`)、顏色(`Color`)等 - 在資料結構實作上,通常使用額外陣列或結構體儲存。 - ![image](https://hackmd.io/_uploads/r1cDmTc2xg.png) --- ### 度數 (無向圖) - 節點`u`的度(`Degree`):與 u 相接的邊數量。 - 葉節點(`Leaf`):度 = 1 的節點(在樹結構中尤為常見)。 - 性質:無向圖中所有節點度數總和 = 2 × 邊數。 ### 度數 (有向圖) - 入度(`In-Degree`):指向該節點的邊數。 - 出度(`Out-Degree`):由該節點指向外部的邊數。 - 有向圖全部節點入度總和 = 邊數,全部節點出度總和 = 邊數。 --- ### 邊權 (無向圖) - 無向邊 (u, v) 之權重 w(u, v) 表示「距離 / 成本 / 時間 / 容量」等。 - 假設對稱則 w(u, v) = w(v, u)。 #### 生活中的例子 - 邊權 - 道路距離、通話費率、網路帶寬、時間成本。 - 可同時存在多種權(如距離與花費),可用多欄位儲存。 ### 邊權 (有向圖) - 有向邊 <u, v> 的權重 w(u, v) 可與 w(v, u) 不同(若反向邊存在)。 - 「雙向的邊可能有不同邊權」:例如上坡耗時 10,下坡耗時 3。 ![image](https://hackmd.io/_uploads/HJg-ETc2ge.png) --- ### 點權 - 每個節點本身也可附加權重或屬性:例如人口數、儲存容量、風險值。 - 可能用於後續計算(例如:選擇最優節點、累加點權)。 #### 生活中的例子 - 點權 - 城市節點:人口 / GDP / 需求量。 - 伺服器節點:CPU 核心數 / 記憶體大小。 - 社群使用者:粉絲數。 --- ### 路徑 - 路徑:不重複節點的連續邊序列。 - 長度:可用「邊數」或「邊權總和」定義。 - 例:在無向圖 1–2–3–4 中,1→4 的路徑為 (1,2,3,4)。 --- ### 路徑有關名詞 - `Walk`(步行):節點與邊序列,允許重複節點或邊。 - `Trail`(蹤徑):不重複邊,但允許節點重複。 - `Path`(路徑):不重複節點(因此亦不重複邊),又稱「簡單路徑」。 - `Cycle`(環):起點與終點相同且長度 ≥ 1(有向圖中自迴圈視為長度 1 環,無向圖通常要求邊數 ≥ 3 且不重複節點除起終點)。 ![image](https://hackmd.io/_uploads/Hygn4ac2xe.png) --- ### 環 (有向圖) - 有向環(`Directed Cycle`):一串節點 v1 → v2 → … → vk → v1 且 k ≥ 1(k=1 為自迴圈)。 - 允許方向性閉合。 - 例:A→B→C→A。 ![cycle-BFS](https://hackmd.io/_uploads/S1-gSaq3gl.png) ### 環 (無向圖) - 無向環:一序列節點 v1 - v2 - … - vk - v1,k ≥ 3,且除起終點外不重複節點。 - 例:1—2—3—1。 - 在無向樹中不存在任何環。 ![image](https://hackmd.io/_uploads/HyKQBTqnxg.png) --- ### 建立一張圖 1. 明確節點語意(人 / 地點 / 任務 / 物件)。 2. 明確邊語意(互動 / 通路 / 順序 / 資料流)。 3. 決定有向或無向(方向是否重要)。 4. 是否需要邊權 / 點權(量化指標?)。 5. 是否允許多重邊或自迴圈(若不是必要,建議避免)。 6. 選擇儲存方式,依圖大小與操作需求選擇。 --- ### 生活中的例子 | 主題 | 例子 | 類型 | |------|------|------| | 無向圖 | Facebook 好友 | 不區分方向 | | 有向圖 | Twitter 追蹤、物流運輸、課程先後修 | 有方向 | | 邊權 | 道路距離、傳輸延遲、費用 | (u,v,w) | | 不同方向不同權 | 上坡/下坡耗時、匯率(A→B 與 B→A 差異) | 有向加權 | | 點權 | 城市人口、伺服器資源、節點重要性 | value[v] | --- ## 總結 圖是一個挺抽象的東西,第一次學會吸收很多專有名詞一時搞不太懂是正常的,基本上就慢慢練習,同時如果疑惑圖到底能幹嘛,等等的課會上圖有關的演算法 ---