// Nguyễn Trọng Khởi _ B22DCCN471
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// Định nghĩa cấu trúc biểu diễn một cạnh trong đồ thị
struct Edge {
int src, dest, weight;
};
// Định nghĩa cấu trúc biểu diễn một đồ thị
struct Graph {
int V, E; // V: số đỉnh, E: số cạnh
vector<Edge> edges; // Danh sách các cạnh
// Constructor
Graph(int V, int E) {
this->V = V;
this->E = E;
}
// Thêm một cạnh vào đồ thị
void addEdge(int src, int dest, int weight) {
Edge edge = {src, dest, weight};
edges.push_back(edge);
}
// Tìm phần tử cha của một đỉnh
int findParent(vector<int>& parent, int i) {
if (parent[i] == -1)
return i;
return findParent(parent, parent[i]);
}
// Hợp nhất hai tập hợp con thành một tập hợp
void unionSets(vector<int>& parent, int x, int y) {
int xset = findParent(parent, x);
int yset = findParent(parent, y);
parent[xset] = yset;
}
// Thuật toán Kruskal để tìm cây bao trùm nhỏ nhất
void KruskalMST() {
vector<Edge> result; // Lưu trữ các cạnh của cây bao trùm nhỏ nhất
// Sắp xếp các cạnh theo trọng số tăng dần
sort(edges.begin(), edges.end(), [](Edge& a, Edge& b) {
return a.weight < b.weight;
});
vector<int> parent(V, -1); // Mảng lưu trữ phần tử cha của các đỉnh
int i = 0, e = 0;
while (e < V - 1 && i < E) {
Edge next_edge = edges[i++];
int x = findParent(parent, next_edge.src);
int y = findParent(parent, next_edge.dest);
// Nếu thêm cạnh này không tạo ra chu trình
if (x != y) {
result.push_back(next_edge);
unionSets(parent, x, y);
e++;
}
}
// In kết quả
cout << "Cac canh cua cay bao trum nho nhat:\n";
for (i = 0; i < result.size(); i++)
cout << result[i].src << " -- " << result[i].dest << " : " << result[i].weight << endl;
}
};
int main() {
int V = 4; // Số đỉnh
int E = 5; // Số cạnh
// Khởi tạo một đồ thị với 4 đỉnh và 5 cạnh
Graph graph(V, E);
// Thêm các cạnh vào đồ thị
graph.addEdge(0, 1, 10);
graph.addEdge(0, 2, 6);
graph.addEdge(0, 3, 5);
graph.addEdge(1, 3, 15);
graph.addEdge(2, 3, 4);
// Tìm cây bao trùm nhỏ nhất và in kết quả
graph.KruskalMST();
return 0;
}
Ly8gTmd1eeG7hW4gVHLhu41uZyBLaOG7n2kgXyBCMjJEQ0NONDcxCgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDxhbGdvcml0aG0+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKLy8gxJDhu4tuaCBuZ2jEqWEgY+G6pXUgdHLDumMgYmnhu4N1IGRp4buFbiBt4buZdCBj4bqhbmggdHJvbmcgxJHhu5MgdGjhu4sKc3RydWN0IEVkZ2UgewogICAgaW50IHNyYywgZGVzdCwgd2VpZ2h0Owp9OwoKLy8gxJDhu4tuaCBuZ2jEqWEgY+G6pXUgdHLDumMgYmnhu4N1IGRp4buFbiBt4buZdCDEkeG7kyB0aOG7iwpzdHJ1Y3QgR3JhcGggewogICAgaW50IFYsIEU7IC8vIFY6IHPhu5EgxJHhu4luaCwgRTogc+G7kSBj4bqhbmgKICAgIHZlY3RvcjxFZGdlPiBlZGdlczsgLy8gRGFuaCBzw6FjaCBjw6FjIGPhuqFuaAoKICAgIC8vIENvbnN0cnVjdG9yCiAgICBHcmFwaChpbnQgViwgaW50IEUpIHsKICAgICAgICB0aGlzLT5WID0gVjsKICAgICAgICB0aGlzLT5FID0gRTsKICAgIH0KCiAgICAvLyBUaMOqbSBt4buZdCBj4bqhbmggdsOgbyDEkeG7kyB0aOG7iwogICAgdm9pZCBhZGRFZGdlKGludCBzcmMsIGludCBkZXN0LCBpbnQgd2VpZ2h0KSB7CiAgICAgICAgRWRnZSBlZGdlID0ge3NyYywgZGVzdCwgd2VpZ2h0fTsKICAgICAgICBlZGdlcy5wdXNoX2JhY2soZWRnZSk7CiAgICB9CgogICAgLy8gVMOsbSBwaOG6p24gdOG7rSBjaGEgY+G7p2EgbeG7mXQgxJHhu4luaAogICAgaW50IGZpbmRQYXJlbnQodmVjdG9yPGludD4mIHBhcmVudCwgaW50IGkpIHsKICAgICAgICBpZiAocGFyZW50W2ldID09IC0xKQogICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICByZXR1cm4gZmluZFBhcmVudChwYXJlbnQsIHBhcmVudFtpXSk7CiAgICB9CgogICAgLy8gSOG7o3AgbmjhuqV0IGhhaSB04bqtcCBo4bujcCBjb24gdGjDoG5oIG3hu5l0IHThuq1wIGjhu6NwCiAgICB2b2lkIHVuaW9uU2V0cyh2ZWN0b3I8aW50PiYgcGFyZW50LCBpbnQgeCwgaW50IHkpIHsKICAgICAgICBpbnQgeHNldCA9IGZpbmRQYXJlbnQocGFyZW50LCB4KTsKICAgICAgICBpbnQgeXNldCA9IGZpbmRQYXJlbnQocGFyZW50LCB5KTsKICAgICAgICBwYXJlbnRbeHNldF0gPSB5c2V0OwogICAgfQoKICAgIC8vIFRodeG6rXQgdG/DoW4gS3J1c2thbCDEkeG7gyB0w6xtIGPDonkgYmFvIHRyw7ltIG5o4buPIG5o4bqldAogICAgdm9pZCBLcnVza2FsTVNUKCkgewogICAgICAgIHZlY3RvcjxFZGdlPiByZXN1bHQ7IC8vIEzGsHUgdHLhu68gY8OhYyBj4bqhbmggY+G7p2EgY8OieSBiYW8gdHLDuW0gbmjhu48gbmjhuqV0CgogICAgICAgIC8vIFPhuq9wIHjhur9wIGPDoWMgY+G6oW5oIHRoZW8gdHLhu41uZyBz4buRIHTEg25nIGThuqduCiAgICAgICAgc29ydChlZGdlcy5iZWdpbigpLCBlZGdlcy5lbmQoKSwgW10oRWRnZSYgYSwgRWRnZSYgYikgewogICAgICAgICAgICByZXR1cm4gYS53ZWlnaHQgPCBiLndlaWdodDsKICAgICAgICB9KTsKCiAgICAgICAgdmVjdG9yPGludD4gcGFyZW50KFYsIC0xKTsgLy8gTeG6o25nIGzGsHUgdHLhu68gcGjhuqduIHThu60gY2hhIGPhu6dhIGPDoWMgxJHhu4luaAoKICAgICAgICBpbnQgaSA9IDAsIGUgPSAwOwogICAgICAgIHdoaWxlIChlIDwgViAtIDEgJiYgaSA8IEUpIHsKICAgICAgICAgICAgRWRnZSBuZXh0X2VkZ2UgPSBlZGdlc1tpKytdOwogICAgICAgICAgICBpbnQgeCA9IGZpbmRQYXJlbnQocGFyZW50LCBuZXh0X2VkZ2Uuc3JjKTsKICAgICAgICAgICAgaW50IHkgPSBmaW5kUGFyZW50KHBhcmVudCwgbmV4dF9lZGdlLmRlc3QpOwoKICAgICAgICAgICAgLy8gTuG6v3UgdGjDqm0gY+G6oW5oIG7DoHkga2jDtG5nIHThuqFvIHJhIGNodSB0csOsbmgKICAgICAgICAgICAgaWYgKHggIT0geSkgewogICAgICAgICAgICAgICAgcmVzdWx0LnB1c2hfYmFjayhuZXh0X2VkZ2UpOwogICAgICAgICAgICAgICAgdW5pb25TZXRzKHBhcmVudCwgeCwgeSk7CiAgICAgICAgICAgICAgICBlKys7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIEluIGvhur90IHF14bqjCiAgICAgICAgY291dCA8PCAiQ2FjIGNhbmggY3VhIGNheSBiYW8gdHJ1bSBuaG8gbmhhdDpcbiI7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IHJlc3VsdC5zaXplKCk7IGkrKykKICAgICAgICAgICAgY291dCA8PCByZXN1bHRbaV0uc3JjIDw8ICIgLS0gIiA8PCByZXN1bHRbaV0uZGVzdCA8PCAiIDogIiA8PCByZXN1bHRbaV0ud2VpZ2h0IDw8IGVuZGw7CiAgICB9Cn07CgppbnQgbWFpbigpIHsKICAgIGludCBWID0gNDsgLy8gU+G7kSDEkeG7iW5oCiAgICBpbnQgRSA9IDU7IC8vIFPhu5EgY+G6oW5oCgogICAgLy8gS2jhu59pIHThuqFvIG3hu5l0IMSR4buTIHRo4buLIHbhu5tpIDQgxJHhu4luaCB2w6AgNSBj4bqhbmgKICAgIEdyYXBoIGdyYXBoKFYsIEUpOwoKICAgIC8vIFRow6ptIGPDoWMgY+G6oW5oIHbDoG8gxJHhu5MgdGjhu4sKICAgIGdyYXBoLmFkZEVkZ2UoMCwgMSwgMTApOwogICAgZ3JhcGguYWRkRWRnZSgwLCAyLCA2KTsKICAgIGdyYXBoLmFkZEVkZ2UoMCwgMywgNSk7CiAgICBncmFwaC5hZGRFZGdlKDEsIDMsIDE1KTsKICAgIGdyYXBoLmFkZEVkZ2UoMiwgMywgNCk7CgogICAgLy8gVMOsbSBjw6J5IGJhbyB0csO5bSBuaOG7jyBuaOG6pXQgdsOgIGluIGvhur90IHF14bqjCiAgICBncmFwaC5LcnVza2FsTVNUKCk7CgogICAgcmV0dXJuIDA7Cn0K