Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Chương trình C++ tô màu cạnh cho Line Graph

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)

  1. Xây dựng Line Graph từ danh sách cạnh của G.
  2. Duyệt các đỉnh của Line Graph (tức các cạnh của G).
  3. 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ệ).