Professional Documents
Culture Documents
Thuật Toán Kruskal Thuật Toán Cây Khung Nhỏ Nhất
Thuật Toán Kruskal Thuật Toán Cây Khung Nhỏ Nhất
using System;
using System.Collections.Generic;
void MakeSet()
{
for (int i = 1; i <= n; i++)
{
parent[i] = i;
sz[i] = 1;
}
}
int Find(int v)
{
if (v == parent[v]) return v;
return parent[v] = Find(parent[v]);
}
return true;
}
void Kruskal()
{
int d = 0;
List<Edge> mst = new List<Edge>();
edges.Sort();
if (Union(e.U, e.V))
{
mst.Add(e);
d += e.Weight;
}
}
if (mst.Count != n - 1)
{
Console.WriteLine("Do thi khong lien thong!");
}
else
{
Console.WriteLine("MST: " + d);
foreach (var e in mst)
{
Console.WriteLine(e.U + " " + e.V + " " + e.Weight);
}
}
}
void Input()
{
Console.WriteLine("Nhap so dinh cua do thi: ");
n = int.Parse(Console.ReadLine());
mst.Input();
mst.MakeSet();
mst.Kruskal();
}
}
cách tư duy:
● Sắp xếp các cạnh theo trọng số tăng dần: Trước tiên, chúng ta sẽ sắp xếp
danh sách các cạnh của đồ thị theo trọng số tăng dần. Điều này giúp chúng ta
chọn các cạnh có trọng số nhỏ nhất trước.
● Duyệt qua các cạnh và kiểm tra tính liên thông: Sau khi danh sách các
cạnh đã được sắp xếp, chúng ta duyệt qua từng cạnh và kiểm tra xem liệu
việc thêm cạnh này vào cây khung có gây ra chu trình hay không. Điều này
có thể được thực hiện bằng cách sử dụng cấu trúc dữ liệu Union-Find để
theo dõi các thành phần liên thông của đồ thị.
● Thêm cạnh vào cây khung nếu không tạo thành chu trình: Nếu việc thêm
cạnh vào cây khung không tạo ra chu trình, chúng ta thêm cạnh đó vào cây
khung và cập nhật trọng số tổng của cây khung.
● Lặp lại cho đến khi có đủ n - 1 cạnh: Chúng ta tiếp tục lặp lại quá trình trên
cho đến khi chúng ta đã chọn được đủ n - 1 cạnh, nơi n là số lượng đỉnh của
đồ thị. Khi đó, chúng ta đã tìm được cây khung nhỏ nhất của đồ thị.
nhấn mạnh vào việc chọn các cạnh có trọng số nhỏ nhất trước, sau đó kiểm
tra xem việc thêm cạnh đó vào cây khung có tạo chu trình hay không. Nếu
không tạo ra chu trình, chúng ta thêm cạnh đó vào cây khung và tiếp tục lặp
lại quá trình cho đến khi cây khung hoàn thành.