Line Graph L(G) của đồ thị vô hướng G: mỗi đỉnh của L(G) đại diện cho một cạnh của G; hai đỉnh trong L(G) kề nhau nếu hai cạnh tương ứng trong G chia sẻ một đỉnh chung.
Edge Coloring (Tô màu cạnh) của Line Graph tương đương Vertex Coloring của L(G). Mục tiêu: gán màu cho các cạnh sao cho hai cạnh chung đỉnh có màu khác nhau. Số màu tối thiểu = chromatic index.
Thuật toán tham lam (Greedy)
- Xây dựng Line Graph từ danh sách cạnh của G.
- Duyệt các đỉnh của Line Graph (tức các cạnh của G).
- Gán màu nhỏ nhất chưa được dùng bởi các đỉnh kề đã tô.
Ví dụ mã
#include <iostream>
#include <vector>
using namespace std;
int main() {
int V, E;
cout << "Số đỉnh G: "; cin >> V;
cout << "Số cạnh G: "; cin >> E;
vector<pair<int,int>> edges(E);
for (int i = 0; i < E; ++i) {
cout << "Cạnh " << i+1 << " (u v): ";
cin >> edges[i].first >> edges[i].second;
--edges[i].first; --edges[i].second; // 0-based
}
// Xây dựng Line Graph: đỉnh i kề đỉnh j nếu edges[i] và edges[j] chung đỉnh
vector<vector<int>> lineAdj(E);
for (int i = 0; i < E; ++i) {
for (int j = i+1; j < E; ++j) {
auto [u1, v1] = edges[i];
auto [u2, v2] = edges[j];
if (u1 == u2 || u1 == v2 || v1 == u2 || v1 == v2) {
lineAdj[i].push_back(j);
lineAdj[j].push_back(i);
}
}
}
// Tô màu tham lam
vector<int> color(E, -1);
for (int i = 0; i < E; ++i) {
vector<bool> used(E+1, false);
for (int nb : lineAdj[i])
if (color[nb] != -1) used[color[nb]] = true;
int c = 1;
while (used[c]) ++c;
color[i] = c;
}
// In kết quả
for (int i = 0; i < E; ++i) {
cout << "Cạnh " << edges[i].first+1 << "-" << edges[i].second+1
<< " (đỉnh " << char('a'+i) << "): Màu " << color[i] << endl;
}
return 0;
}
Kết quả mẫu
Số đỉnh G: 4 Số cạnh G: 3 Cạnh 1 (u v): 1 2 Cạnh 2 (u v): 3 2 Cạnh 3 (u v): 4 1 Cạnh 1-2 (đỉnh a): Màu 1 Cạnh 1-3 (đỉnh b): Màu 2 Cạnh 2-3 (đỉnh c): Màu 1
Đồ thị G: 1-2, 3-2, 4-1. Line Graph: a(1-2) kề b(3-2) và c(4-1); b kề a; c kề a. Tô màu: a=1, b=2, c=1 (hợp lệ).