PRIM

PHOTO EMBED

Thu Aug 29 2024 03:59:30 GMT+0000 (Coordinated Universal Time)

Saved by @LizzyTheCatto

#include <bits/stdc++.h>  // Thư viện tiêu chuẩn cho C++ (bao gồm tất cả các thư viện phổ biến)
using namespace std;

void primMST(int V, vector<vector<pair<int, int>>>& adj) {  // Hàm tìm MST với V đỉnh và danh sách kề 'adj'
    vector<int> key(V, INT_MAX), parent(V, -1);  // 'key' lưu trọng số nhỏ nhất để kết nối, 'parent' lưu đỉnh cha
    vector<bool> inMST(V, false);  // Đánh dấu đỉnh nào đã được thêm vào MST
    priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;  // Min-heap lưu (trọng số, đỉnh)

    key[0] = 0;  // Khởi tạo đỉnh đầu tiên với trọng số 0 (bắt đầu từ đỉnh 0)
    pq.push({0, 0});  // Đẩy đỉnh 0 vào hàng đợi ưu tiên với trọng số 0

    while (!pq.empty()) {  // Vòng lặp chính: Chạy cho đến khi hàng đợi rỗng
        int u = pq.top().second;  // Lấy đỉnh 'u' có trọng số nhỏ nhất từ hàng đợi
        pq.pop();  // Loại bỏ đỉnh 'u' khỏi hàng đợi
        inMST[u] = true;  // Đánh dấu 'u' đã được thêm vào MST

        // Duyệt qua tất cả các đỉnh kề 'v' của 'u' với trọng số 'weight'
        for (auto& [v, weight] : adj[u]) {  
            // Nếu 'v' chưa thuộc MST và 'weight' nhỏ hơn trọng số hiện tại 'key[v]'
            if (!inMST[v] && weight < key[v]) {  
                key[v] = weight;  // Cập nhật 'key[v]' với trọng số mới
                pq.push({key[v], v});  // Đẩy (trọng số mới, đỉnh 'v') vào hàng đợi ưu tiên
                parent[v] = u;  // Cập nhật đỉnh cha 'u' của 'v'
            }
        }
    }

    // In ra các cạnh của cây khung nhỏ nhất (MST)
    for (int i = 1; i < V; i++)  // Duyệt qua các đỉnh từ 1 đến V-1
        cout << parent[i] << " - " << i << " (" << key[i] << ")\n";  // In cạnh (parent[i] - i) và trọng số (key[i])
}
content_copyCOPY