// Nguyễn Trọng Khởi _ B22DCCN471
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
// Định nghĩa cấu trúc biểu diễn một cạnh trong đồ thị
struct Edge {
int dest, weight;
} ;
// Định nghĩa cấu trúc biểu diễn một đồ thị
class Graph {
private :
int V; // Số đỉnh
vector< vector< Edge>> adjList; // Danh sách kề của đồ thị
public :
// Constructor
Graph( int V) {
this- > V = V;
adjList.resize ( V) ;
}
// Thêm một cạnh vào đồ thị (với trọng số)
void addEdge( int src, int dest, int weight) {
Edge edge = { dest, weight} ;
adjList[ src] .push_back ( edge) ;
// Với đồ thị vô hướng, hãy thêm cạnh ngược lại
edge.dest = src;
adjList[ dest] .push_back ( edge) ;
}
// Thuật toán Prim để tìm cây bao trùm nhỏ nhất
void PrimMST( ) {
// Đánh dấu các đỉnh đã được thăm
vector< bool > visited( V, false ) ;
// Priority queue để chọn cạnh có trọng số nhỏ nhất
priority_queue< pair< int , int > , vector< pair< int , int >> , greater< pair< int , int >>> pq;
// Bắt đầu từ đỉnh 0
int src = 0 ;
pq.push ( { 0 , src} ) ; // Cạnh với trọng số 0 và đỉnh xuất phát src
while ( ! pq.empty ( ) ) {
int u = pq.top ( ) .second ; // Lấy đỉnh với trọng số nhỏ nhất
pq.pop ( ) ;
// Đánh dấu đỉnh hiện tại là đã thăm
visited[ u] = true ;
// In kết quả, lưu ý rằng đỉnh 0 không có đỉnh cha
if ( u ! = src)
cout << "Canh: " << u << " - " << pq.top ( ) .second << " Trong so: " << pq.top ( ) .first << endl;
// Duyệt qua tất cả các đỉnh kề của đỉnh hiện tại
for ( auto edge : adjList[ u] ) {
int v = edge.dest ;
int weight = edge.weight ;
// Nếu đỉnh v chưa được thăm và có trọng số nhỏ hơn
if ( ! visited[ v] )
pq.push ( { weight, v} ) ;
}
}
}
} ;
int main( ) {
int V = 5 ; // Số đỉnh
// Khởi tạo một đồ thị với 5 đỉnh
Graph graph( V) ;
// Thêm các cạnh vào đồ thị
graph.addEdge ( 0 , 1 , 2 ) ;
graph.addEdge ( 0 , 3 , 6 ) ;
graph.addEdge ( 1 , 2 , 3 ) ;
graph.addEdge ( 1 , 3 , 8 ) ;
graph.addEdge ( 1 , 4 , 5 ) ;
graph.addEdge ( 2 , 4 , 7 ) ;
graph.addEdge ( 3 , 4 , 9 ) ;
// Tìm cây bao trùm nhỏ nhất và in kết quả
graph.PrimMST ( ) ;
return 0 ;
}
Ly8gTmd1eeG7hW4gVHLhu41uZyBLaOG7n2kgXyBCMjJEQ0NONDcxCgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDxxdWV1ZT4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgovLyDEkOG7i25oIG5naMSpYSBj4bqldSB0csO6YyBiaeG7g3UgZGnhu4VuIG3hu5l0IGPhuqFuaCB0cm9uZyDEkeG7kyB0aOG7iwpzdHJ1Y3QgRWRnZSB7CiAgICBpbnQgZGVzdCwgd2VpZ2h0Owp9OwoKLy8gxJDhu4tuaCBuZ2jEqWEgY+G6pXUgdHLDumMgYmnhu4N1IGRp4buFbiBt4buZdCDEkeG7kyB0aOG7iwpjbGFzcyBHcmFwaCB7CnByaXZhdGU6CiAgICBpbnQgVjsgLy8gU+G7kSDEkeG7iW5oCiAgICB2ZWN0b3I8dmVjdG9yPEVkZ2U+PiBhZGpMaXN0OyAvLyBEYW5oIHPDoWNoIGvhu4EgY+G7p2EgxJHhu5MgdGjhu4sKCnB1YmxpYzoKICAgIC8vIENvbnN0cnVjdG9yCiAgICBHcmFwaChpbnQgVikgewogICAgICAgIHRoaXMtPlYgPSBWOwogICAgICAgIGFkakxpc3QucmVzaXplKFYpOwogICAgfQoKICAgIC8vIFRow6ptIG3hu5l0IGPhuqFuaCB2w6BvIMSR4buTIHRo4buLICh24bubaSB0cuG7jW5nIHPhu5EpCiAgICB2b2lkIGFkZEVkZ2UoaW50IHNyYywgaW50IGRlc3QsIGludCB3ZWlnaHQpIHsKICAgICAgICBFZGdlIGVkZ2UgPSB7ZGVzdCwgd2VpZ2h0fTsKICAgICAgICBhZGpMaXN0W3NyY10ucHVzaF9iYWNrKGVkZ2UpOwogICAgICAgIC8vIFbhu5tpIMSR4buTIHRo4buLIHbDtCBoxrDhu5tuZywgaMOjeSB0aMOqbSBj4bqhbmggbmfGsOG7o2MgbOG6oWkKICAgICAgICBlZGdlLmRlc3QgPSBzcmM7CiAgICAgICAgYWRqTGlzdFtkZXN0XS5wdXNoX2JhY2soZWRnZSk7CiAgICB9CgogICAgLy8gVGh14bqtdCB0b8OhbiBQcmltIMSR4buDIHTDrG0gY8OieSBiYW8gdHLDuW0gbmjhu48gbmjhuqV0CiAgICB2b2lkIFByaW1NU1QoKSB7CiAgICAgICAgLy8gxJDDoW5oIGThuqV1IGPDoWMgxJHhu4luaCDEkcOjIMSRxrDhu6NjIHRoxINtCiAgICAgICAgdmVjdG9yPGJvb2w+IHZpc2l0ZWQoViwgZmFsc2UpOwogICAgICAgIC8vIFByaW9yaXR5IHF1ZXVlIMSR4buDIGNo4buNbiBj4bqhbmggY8OzIHRy4buNbmcgc+G7kSBuaOG7jyBuaOG6pXQKICAgICAgICBwcmlvcml0eV9xdWV1ZTxwYWlyPGludCwgaW50PiwgdmVjdG9yPHBhaXI8aW50LCBpbnQ+PiwgZ3JlYXRlcjxwYWlyPGludCwgaW50Pj4+IHBxOwogICAgICAgIAogICAgICAgIC8vIELhuq90IMSR4bqndSB04burIMSR4buJbmggMAogICAgICAgIGludCBzcmMgPSAwOwogICAgICAgIHBxLnB1c2goezAsIHNyY30pOyAvLyBD4bqhbmggduG7m2kgdHLhu41uZyBz4buRIDAgdsOgIMSR4buJbmggeHXhuqV0IHBow6F0IHNyYwogICAgICAgIAogICAgICAgIHdoaWxlICghcHEuZW1wdHkoKSkgewogICAgICAgICAgICBpbnQgdSA9IHBxLnRvcCgpLnNlY29uZDsgLy8gTOG6pXkgxJHhu4luaCB24bubaSB0cuG7jW5nIHPhu5Egbmjhu48gbmjhuqV0CiAgICAgICAgICAgIHBxLnBvcCgpOwoKICAgICAgICAgICAgLy8gxJDDoW5oIGThuqV1IMSR4buJbmggaGnhu4duIHThuqFpIGzDoCDEkcOjIHRoxINtCiAgICAgICAgICAgIHZpc2l0ZWRbdV0gPSB0cnVlOwoKICAgICAgICAgICAgLy8gSW4ga+G6v3QgcXXhuqMsIGzGsHUgw70gcuG6sW5nIMSR4buJbmggMCBraMO0bmcgY8OzIMSR4buJbmggY2hhCiAgICAgICAgICAgIGlmICh1ICE9IHNyYykKICAgICAgICAgICAgICAgIGNvdXQgPDwgIkNhbmg6ICIgPDwgdSA8PCAiIC0gIiA8PCBwcS50b3AoKS5zZWNvbmQgPDwgIiBUcm9uZyBzbzogIiA8PCBwcS50b3AoKS5maXJzdCA8PCBlbmRsOwoKICAgICAgICAgICAgLy8gRHV54buHdCBxdWEgdOG6pXQgY+G6oyBjw6FjIMSR4buJbmgga+G7gSBj4bunYSDEkeG7iW5oIGhp4buHbiB04bqhaQogICAgICAgICAgICBmb3IgKGF1dG8gZWRnZSA6IGFkakxpc3RbdV0pIHsKICAgICAgICAgICAgICAgIGludCB2ID0gZWRnZS5kZXN0OwogICAgICAgICAgICAgICAgaW50IHdlaWdodCA9IGVkZ2Uud2VpZ2h0OwoKICAgICAgICAgICAgICAgIC8vIE7hur91IMSR4buJbmggdiBjaMawYSDEkcaw4bujYyB0aMSDbSB2w6AgY8OzIHRy4buNbmcgc+G7kSBuaOG7jyBoxqFuCiAgICAgICAgICAgICAgICBpZiAoIXZpc2l0ZWRbdl0pCiAgICAgICAgICAgICAgICAgICAgcHEucHVzaCh7d2VpZ2h0LCB2fSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn07CgppbnQgbWFpbigpIHsKICAgIGludCBWID0gNTsgLy8gU+G7kSDEkeG7iW5oCgogICAgLy8gS2jhu59pIHThuqFvIG3hu5l0IMSR4buTIHRo4buLIHbhu5tpIDUgxJHhu4luaAogICAgR3JhcGggZ3JhcGgoVik7CgogICAgLy8gVGjDqm0gY8OhYyBj4bqhbmggdsOgbyDEkeG7kyB0aOG7iwogICAgZ3JhcGguYWRkRWRnZSgwLCAxLCAyKTsKICAgIGdyYXBoLmFkZEVkZ2UoMCwgMywgNik7CiAgICBncmFwaC5hZGRFZGdlKDEsIDIsIDMpOwogICAgZ3JhcGguYWRkRWRnZSgxLCAzLCA4KTsKICAgIGdyYXBoLmFkZEVkZ2UoMSwgNCwgNSk7CiAgICBncmFwaC5hZGRFZGdlKDIsIDQsIDcpOwogICAgZ3JhcGguYWRkRWRnZSgzLCA0LCA5KTsKCiAgICAvLyBUw6xtIGPDonkgYmFvIHRyw7ltIG5o4buPIG5o4bqldCB2w6AgaW4ga+G6v3QgcXXhuqMKICAgIGdyYXBoLlByaW1NU1QoKTsKCiAgICByZXR1cm4gMDsKfQo=