Lý thuyết đồ thị

Phần này mình sử dụng các quyển sách dành cho học sinh chuyên Tin [12].

Các định nghĩa cơ bản

Định nghĩa 27 (Đồ thị)

Đồ thị (hay graph, hay граф) \(G = (V, E)\) gồm một tập hợp các đỉnh \(V\) và tập hợp các cạnh \(E\) nối các đỉnh với nhau.

Đồ thị vô hướng

Ví dụ 21

Đồ thị sau có:

  1. Tập hợp các đỉnh

\[V = \{ v_1, v_2, v_3, v_4, v_5, v_6 \}.\]
  1. Tập hợp các cạnh

\[E = \{ e_{12}, e_{23}, e_{24}, e_{26}, e_{56} \}.\]
../../_images/undirected-graph.jpg

Hình 4 Đồ thị vô hướng

Ở ví dụ trên, cạnh \(e_{ij}\) nối đỉnh \(v_i\) và đỉnh \(v_j\). Trong trường hợp này hướng của cạnh không quan trọng nên việc viết \(e_{ij}\)\(e_{ji}\) là tương đương. Đồ thị lúc này gọi là đồ thị vô hướng (hay undirected graph).

Hai đỉnh được gọi là kề nhau (hay adjacent) nếu có cạnh nối giữa chúng.

Ở ví dụ trên thì hai đỉnh \(v_1\)\(v_2\) kề nhau, nhưng đỉnh \(v_1\) không kề với \(v_3\) vì không có cạnh \(e_{13}\).

Khi đó cạnh nối hai đỉnh kề nhau được gọi là cạnh liên thuộc (hay incident).

Ở đồ thị vô hướng, ta nói bậc (hay degree) của đỉnh \(v\) là số cạnh liên thuộc với đỉnh \(v\), và kí hiệu là \(\deg (v)\).

Hình 4 ta thấy \(\deg (v_1) = 1\), \(\deg (v_2) = 3\), \(\deg (v_3) = 1\), \(\deg (v_4) = 1\), \(\deg (v_5) = 1\), \(\deg (v_6) = 2\). Tổng quát ta có định lí sau.

Định lí 8

Giả sử \(G = (V, E)\) là đồ thị vô hướng, khi đó tổng tất cả các bậc của các đỉnh trong \(V\) sẽ bằng hai lần số cạnh:

\[\sum_{v \in V} \deg (v) = 2 \lvert E \rvert.\]

Hệ quả 2

Trong đồ thị vô hướng thì số đỉnh có bậc lẻ là số chẵn.

Đồ thị có hướng

Nếu chúng ta quan tâm đến hướng thì khi vẽ cạnh \(e_{ij}\) ta vẽ mũi tên từ đỉnh \(v_i\) tới đỉnh \(v_j\). Đồ thị khi đó gọi là đồ thị có hướng (hay directed graph).

../../_images/directed-graph.jpg

Hình 5 Đồ thị có hướng

Ở hình trên:

  • chỉ có cạnh từ \(v_1\) tới \(v_2\)\(e_{12}\) chứ không có cạnh từ \(v_2\) tới \(v_1\)

  • có cạnh từ \(v_6\) tới \(v_5\)\(e_{65}\) và cũng có cạnh từ \(v_5\) tới \(v_6\)\(e_{56}\).

Lúc này tập đỉnh là

\[V = \{ v_1, v_2, v_3, v_4, v_5, v_6 \},\]

và tập cạnh là

\[E = \{ e_{12}, e_{23}, e_{24}, e_{52}, e_{56}, e_{65} \}.\]

Đối với đồ thị có hướng thì cạnh \(e_{ij}\) là cạnh đi ra từ đỉnh \(i\) và đi vào đỉnh \(j\). Đỉnh \(i\) gọi là đỉnh đầu, đỉnh \(j\) gọi là đỉnh cuối.

Định nghĩa 28 (Bán bậc vào, bán bậc ra)

Bán bậc ra (hay out-degree) của đỉnh \(v\) là số lượng cạnh đi ra khỏi nó và kí hiệu là \(\deg^+(v)\).

Bán bậc vào (hay in-degree) của đỉnh \(v\) là số lượng cạnh đi vào nó và kí hiệu là \(\deg^-(v)\).

Với ví dụ ở Hình 5 thì:

  • \(\deg^+(v_1) = 1\), \(\deg^-(v_1) = 0\);

  • \(\deg^+(v_2) = 2\), \(\deg^-(v_2) = 1\);

  • \(\deg^+(v_3) = 0\), \(\deg^-(v_3) = 1\);

  • \(\deg^+(v_4) = 0\), \(\deg^-(v_4) = 1\);

  • \(\deg^+(v_5) = 2\), \(\deg^-(v_5) = 1\);

  • \(\deg^+(v_6) = 1\), \(\deg^-(v_6) = 1\).

Định lí 9

Nếu \(G = (V, E)\) là đồ thị có hướng thì tổng tất cả các bán bậc ra của các đỉnh bằng tổng tất cả các bán bậc vào, và cũng bằng tổng số cung của đồ thị

\[\sum_{v \in V} \deg^+(v) = \sum_{v \in V} \deg^-(v) = \lvert E \rvert.\]

Đường đi và chu trình

Một dãy có thứ tự các đỉnh \(v_{i_0}\), \(v_{i_1}\), ..., \(v_{i_n}\) sao cho \(e_{i_t i_{t+1}} \in E\) với mọi \(t = 0, 1, \ldots, n-1\) được gọi là đường đi. Lúc này đường đi có \(n+1\) đỉnh \(v_{i_0}\), \(v_{i_1}\), ..., \(v_{i_n}\)\(n\) cạnh \(e_{i_0 i_1}\), \(e_{i_1 i_2}\), ..., \(e_{i_{n-1} i_n}\).

Nếu tồn tại một đường đi từ đỉnh \(v_{i_0}\) tới đỉnh \(v_{i_n}\) thì ta nói đỉnh \(v_{i_n}\) đến được (hay reachable) từ đỉnh \(v_{i_0}\) và kí hiệu là \(v_{i_0} \leadsto v_{i_n}\).

  1. Đỉnh \(v_{i_0}\) được gọi là đỉnh đầu của đường đi.

  2. Đỉnh \(v_{i_n}\) được gọi là đỉnh cuối của đường đi.

  3. Các đỉnh \(v_{i_1}\), ..., \(v_{i_{n-1}}\) được gọi là đỉnh trong của đường đi.

Đường đi được gọi là đường đi đơn (hay simple) nếu tất cả các đỉnh trên đường đi hoàn toàn phân biệt.

Hình 6 thể hiện hai đường đi đơn từ đỉnh \(v_1\) tới đỉnh \(v_3\):

  • đường đi thứ nhất là \(v_1\), tới \(v_2\) và tới \(v_3\)

  • đường đi thứ hai là \(v_1\), tới \(v_2\), đi xuống \(v_4\), đi lên \(v_6\) và quay lại \(v_3\).

../../_images/path.jpg

Hình 6 Đường đi từ \(v_1\) tới \(v_3\)

Đường đi được gọi là chu trình (hay circuit) nếu đỉnh đầu trùng với đỉnh cuối, nghĩa là \(v_{i_0} = v_{i_n}\).

Đẳng cấu đồ thị

Định nghĩa 29

Hai đồ thị \(G = (V, E)\)\(G' = (V', E')\) được gọi là đẳng cấu (hay isomorphic) nếu tồn tại một song ánh \(f : V \to V'\) sao cho số cung nối đỉnh \(u\) với đỉnh \(v\) trên \(E\) bằng số cung nối đỉnh \(f(u)\) với đỉnh \(f(v)\) trên \(E'\).

Nói cách khác, kí hiệu \(e_{ij}\) là cạnh nối đỉnh \(v_i\)\(v_j\) trên \(E\). Đặt \(v_i' = f(v_i)\)\(v_j' = f(v_j)\) là các đỉnh thuộc \(V'\). Khi đó \(e_{ij}'\) là cạnh thuộc \(E'\) nối đỉnh \(v'_i\) và đỉnh \(v'_j\). Nếu giữa \(v_i\)\(v_j\) không có cạnh nào thì cũng không có cạnh nối \(v_i'\)\(v_j'\).

Bài toán đẳng cấu đồ thị (graph isomorphism problem) là một trong những bài toán khó hiện nay (tháng 1 năm 2025) về việc tìm lời giải trong thời gian đa thức. Nếu cho trước hai đồ thị thì nhiệm vụ của bài toán là xác định xem hai đồ thị có đẳng cấu hay không. Rõ ràng nếu số đỉnh nhỏ thì chúng ta có thể thử từng hoán vị (song ánh) của tập đỉnh, nhưng khi số đỉnh lớn thì việc thử sai tất cả hoán vị là không thể.

Đồ thị con

Định nghĩa 30 (Đồ thị con)

Đồ thị \(G' = (V', E')\)đồ thị con (hay subgraph, hay подграф) của đồ thị \(G = (V, E)\) nếu \(V' \subseteq V\)\(E' \subseteq E\).

Nói cách khác, đồ thị con thu được từ đồ thị ban đầu bằng việc lấy một lượng nhất định đỉnh và cạnh.

Ở đồ thị trên Hình 7, mình lấy các đỉnh \(v_1\), \(v_2\), \(v_4\)\(v_5\), và lấy các cạnh \(e_{24}\), \(e_{45}\) thì mình có đồ thị con trên Hình 8. Các bạn có thể thấy ở đồ thị ban đầu thì \(v_1\) nối với \(v_2\), nhưng ở đồ thị con thì không có cạnh nối giữa hai đỉnh này.

../../_images/subgraph-1.jpg

Hình 7 Đồ thị ban đầu

../../_images/subgraph-2.jpg

Hình 8 Đồ thị con

Đồ thị đầy đủ

Đồ thị vô hướng được gọi là đầy đủ (hay complete, hay полный) nếu mọi cặp đỉnh đều kề nhau.

Đồ thị đầy đủ gồm \(n\) đỉnh kí hiệu là \(K_n\).

../../_images/complete-graph.jpg

Hình 9 Ví dụ \(K_6\)

Dễ thấy số cạnh của đồ thị đầy đủ \(n\) đỉnh là \(C^2_n\).

Đồ thị hai phía

Đồ thị vô hướng được gọi là hai phía (hay bipartite) nếu tập đỉnh của nó có thể chia thành hai tập rời nhau \(V_1\)\(V_2\) sao cho không tồn tại cạnh nối hai đỉnh của \(V_1\), và cũng không tồn tại cạnh nối hai đỉnh của \(V_2\).

Nếu \(\lvert V_1 \rvert = n_1\)\(\lvert V_2 \rvert = n_2\) và giữa mọi cặp đỉnh \((v_1, v_2)\), trong đó \(v_1 \in V_1\)\(v_2 \in V_2\), đều có cạnh nối thì đồ thị hai phía đó được gọi là đồ thị hai phía đầy đủ, kí hiệu là \(K_{v_1, v_2}\).

../../_images/bipartite.jpg

Hình 10 Ví dụ đồ thị hai phía đầy đủ \(K_{3, 2}\)

Theo quy tắc nhân, số cạnh của đồ thị hai phía đầy đủ là \(v_1 \cdot v_2\) vì mỗi đỉnh ở \(V_1\) đều có \(v_2\) cạnh nối với nó, và có tất cả \(v_1\) đỉnh trong \(V_1\).

Đồ thị phẳng

Đồ thị được gọi là đồ thị phẳng (hay planar graph, hay планарный граф) nếu chúng ta có thể vẽ đồ thị trên mặt phẳng sao cho:

  1. Mỗi đỉnh tương ứng với một điểm trên mặt phẳng, không có hai đỉnh cùng tọa độ.

  2. Mỗi cạnh tương ứng với một đường liên tục nối hai đỉnh và hai cạnh bất kì không giao nhau.

Phép vẽ đồ thị phẳng này được gọi là biểu diễn phẳng của đồ thị.

Định lí 10 (Định lí Kuratowski)

Một đồ thị vô hướng là đồ thị phẳng khi và chỉ khi nó không chứa đồ thị con đẳng cấu với \(K_{3, 3}\) hoặc \(K_5\).

Định lí 11 (Công thức Euler)

Nếu một đồ thị vô hướng liên thông là đồ thị phẳng và biểu diễn phẳng của đồ thị đó gồm \(v\) đỉnh và \(e\) cạnh chia mặt phẳng thành \(f\) phần thì

\[v - e + f = 2.\]

Công thức Euler này chúng ta cũng thấy ở hình học không gian đối với một khối đa diện. Nếu \(v\) là số đỉnh (vertices), \(e\) là số cạnh (edges) và \(f\) là số mặt (faces) thì \(v - e + f = 2\).

  1. Hình tứ diện có \(4\) đỉnh, \(6\) cạnh và \(4\) mặt nên \(4 - 6 + 4 = 2\).

  2. Hình lập phương có \(8\) đỉnh, \(12\) cạnh và \(6\) mặt nên \(8 - 12 + 6 = 2\).

Định lí 12

Nếu đồ thị vô hướng \(G = (V, E)\) là đồ thị phẳng có ít nhất \(3\) đỉnh thì

\[\lvert E \rvert \leqslant 3 \lvert V \rvert - 6.\]

Ngoài ra nếu \(G\) không có chu trình độ dài \(3\) thì

\[\lvert E \rvert \leqslant 2 \lvert V \rvert - 4.\]

Tính liên thông của đồ thị

Tính liên thông trên đồ thị vô hướng

Định nghĩa 31 (Đồ thị liên thông)

Một đồ thị vô hướng được gọi là liên thông (hay connected, hay связанный) nếu giữa hai đỉnh bất kì của đồ thị tồn tại đường đi.

Đồ thị chỉ gồm một đỉnh duy nhất cũng được coi là đồ thị liên thông.

../../_images/connected-graph.jpg

Hình 11 Đồ thị liên thông

Định nghĩa 32 (Thành phần liên thông)

Cho đồ thị \(G = (V, E)\). Nếu đồ thị con \(G' = (V', E')\) của \(G\) là đồ thị liên thông thì \(G'\) được gọi là thành phần liên thông (hay connected component, связанный компонент) của đồ thị \(G\).

../../_images/connected-component.jpg

Hình 12 Các thành phần liên thông trên đồ thị

Trên Hình 12 có ba thành phần liên thông:

  • thành phần liên thông thứ nhất gồm hai đỉnh \(v_1\), \(v_2\), và cạnh \(e_{12}\)

  • thành phần liên thông thứ hai gồm ba đỉnh \(v_3\), \(v_4\), \(v_6\), và các cạnh \(e_{36}\), \(e_{46}\)

  • thành phần liên thông thứ ba chỉ gồm đỉnh \(v_5\).

Đôi khi việc bỏ đi một đỉnh và tất cả cạnh liên thuộc với nó sẽ tăng số lượng thành phần liên thông hơn so với đồ thị ban đầu. Các đỉnh như vậy gọi là đỉnh cắt (hay cut vertices), hoặc nút khớp (hay articulation nodes).

Tương tự, khi bỏ đi một cạnh mà số lượng thành phần liên thông tăng lên thì cạnh đó gọi là cạnh cắt (hay cut edges) hoặc cầu (hay bridge).

Hình 13 là một đồ thị liên thông, nếu chúng ta xóa cạnh \(e_{24}\) (cạnh màu đỏ) thì chúng ta sẽ có hai thành phần liên thông:

  • thành phần liên thông thứ nhất gồm hai đỉnh \(v_1\)\(v_2\)

  • thành phần liên thông thứ hai gồm bốn đỉnh \(v_3\), \(v_4\), \(v_5\)\(v_6\).

../../_images/bridge.jpg

Hình 13 Ví dụ về cầu

Đồ thị có thể có nhiều cầu. Ở Hình 13, thay vì xóa cạnh \(e_{24}\), nếu ta xóa cạnh \(e_{46}\) thì cũng làm tăng số thành phần liên thông. Do đó cạnh \(e_{46}\) cũng là cầu. Tương tự cho cạnh \(e_{12}\), ...

Tính liên thông trên đồ thị có hướng

Một đồ thị có hướng được gọi là:

  • liên thông mạnh (hay strongly connected) nếu tồn tại đường đi giữa hai đỉnh bất kì của đồ thị;

  • liên thông yếu (hay weakly connected) nếu phiên bản vô hướng của nó là đồ thị liên thông.

Bài toán xác định các thành phần liên thông

Bài toán xác định các thành phần liên thông của đồ thị là một bài toán quan trọng trong lý thuyết đồ thị. Bài toán sẽ tìm tất cả thành phần liên thông của đồ thị vô hướng.

Để liệt kê các thành phần liên thông của đồ thị vô hướng \(G = (V, E)\) ta thực hiện các bước sau:

  1. Bắt đầu từ một đỉnh bất kì, ta tìm tất cả đỉnh đến được từ đỉnh đó. Như vậy chúng ta tìm được một thành phần liên thông.

  2. Loại những đỉnh ở thành phần liên thông đầu tiên và xét một trong những đỉnh còn lại. Lặp lại công việc ở bước 1, ta tìm tất cả đỉnh đến được từ đỉnh đang xét. Như vậy chúng ta tìm được thêm một thành phần liên thông.

  3. Thực hiện đến khi đã xét hết tất cả đỉnh trong đồ thị.

Ở đây, để tìm tất cả đỉnh đến được từ một đỉnh nào đó trong đồ thị ta sử dụng thuật toán DFS (Depth First Search, Duyệt Sâu) hoặc BFS (Breadth First Search, Duyệt Rộng).

Cây

Định nghĩa 33 (Cây)

Cây (hay tree, hay дерево) là đồ thị vô hướng, liên thông, và không có chu trình đơn.

../../_images/tree.jpg

Hình 14 Ví dụ về cây

Định nghĩa 34 (Cây khung)

Xét đồ thị \(G = (V, E)\)\(T = (V', E')\) là đồ thị con của \(G\). Nếu \(T\) là cây thì ta gọi \(T\)cây khung hoặc cây bao trùm (hay spanning tree) của đồ thị \(G\).

Điều kiện cần và đủ để một đồ thị vô hướng có cây khung là đồ thị đó phải liên thông.

Một đồ thị có thể có nhiều cây khung. Ở Hình 15 ta xóa đi cạnh \(e_{23}\)\(e_{46}\) (hai cạnh màu đỏ) thì thu được một cây khung. Tương tự, ở Hình 16 ta xóa đi hai cạnh màu đỏ là \(e_{13}\)\(e_{23}\) thì cũng thu được một cây khung khác.

../../_images/spanning-tree-1.jpg

Hình 15 Cây khung thứ nhất

../../_images/spanning-tree-2.jpg

Hình 16 Cây khung thứ hai

Định lí 13 (Daisy Chain Theorem)

Giả sử \(T = (V, E)\) là đồ thị vô hướng với \(n\) đỉnh. Khi đó các mệnh đề sau tương đương:

  1. \(T\) là cây.

  2. \(T\) không chứa chu trình đơn và có \(n - 1\) cạnh.

  3. \(T\) liên thông và mỗi cạnh của nó đều là cầu.

  4. Giữa hai đỉnh bất kì của \(G'\) đều tồn tại đúng một đường đi đơn.

  5. \(T\) không chứa chu trình đơn nhưng nếu ta thêm vào một cạnh thì ta thu được chu trình đơn.

  6. \(T\) liên thông và có \(n - 1\) cạnh.

Các mệnh đề trên có thể xem như các định nghĩa tương đương của cây. Trong nhiều trường hợp thì tính chất của cây có thể thu được từ các định nghĩa này nên mình sẽ chứng minh chuỗi mệnh đề này.

Định lí 14

Số cây khung của đồ thị đầy đủ \(K_n\)\(n^{n-2}\).

Đồ thị Euler và đồ thị Hamilton

Đồ thị Euler

Leonhard Euler là người đầu tiên mô hình hóa bài toán rời rạc này thành một hệ thống hoàn chỉnh là Lý thuyết đồ thị hiện nay.

Định nghĩa 35 (Chu trình Euler)

Chu trình đi qua tất cả các cạnh của đồ thị, mỗi cạnh đúng một lần, được gọi là chu trình Euler (hay Euler circuit, Euler circle, Euler tour).

Định nghĩa 36 (Đường đi Euler)

Đường đi đi qua tất cả các cạnh của đồ thị, mỗi cạnh đúng một lần, được gọi là đường đi Euler.

Lúc này, bài toán \(7\) cây cầu nổi tiếng của thành phố Konigsberg (nay là thành phố Kaliningrad thuộc Liên bang Nga) trở thành bài toán xác định xem có tồn tại chu trình Euler hay không.

Định nghĩa 37 (Đồ thị Euler)

Đồ thị có chu trình Euler được gọi là đồ thị Euler (hay Eulerian graph, unicursal graph).

Định nghĩa 38 (Đồ thị nửa Euler)

Đồ thị có đường đi Euler được gọi là đồ thị nửa Euler (hay Semi-Eulerian graph, Traversable graph).

Các định lí và thuật toán trên đồ thị Euler

Định lí 15

Một đồ thị vô hướng liên thông \(G = (V, E)\) có chu trình Euler khi và chỉ khi mọi đỉnh của nó đều có bậc chẵn.

Hệ quả 3

Một đồ thị vô hướng liên thông \(G = (V, E)\) có đường đi Euler khi và chỉ khi nó có đúng hai đỉnh bậc lẻ.

[TODO] Chu trình Euler và đường đi Euler của đồ thị có hướng liên thông yếu.

Đồ thị Hamilton

Khái niệm đường đi và chu trình Hamilton được đưa ra bởi William Rowan Hamilton (1856).

Định nghĩa 39 (Chu trình Hamilton và đồ thị Hamilton)

Đồ thị \(G = (V, E)\) được gọi là đồ thị Hamilton (hay Hamilton graph) nếu tồn tại chu trình đơn đi qua tất cả các đỉnh.

Chu trình đơn đi qua tất cả các đỉnh gọi là chu trình Hamilton (hay Hamiltonian circuit, Hamilton circle).

Người ta quy ước rằng đồ thị chỉ gồm một đỉnh là đồ thị Hamilton nhưng đồ thị gồm hai đỉnh liên thông không phải là đồ thị Hamilton.