Download as pdf or txt
Download as pdf or txt
You are on page 1of 4

Thuật Toán Kruskal Thuật Toán Cây Khung Nhỏ Nhất

using System;
using System.Collections.Generic;

public class KruskalMST


{
class Edge : IComparable<Edge>
{
public int U, V;
public int Weight;

public Edge(int u, int v, int weight)


{
U = u;
V = v;
Weight = weight;
}

public int CompareTo(Edge other)


{
return Weight.CompareTo(other.Weight);
}
}

const int MaxN = 1001;


int[] parent = new int[MaxN];
int[] sz = new int[MaxN];
List<Edge> edges = new List<Edge>();
int n, m;

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]);
}

bool Union(int u, int v)


{
int pu = Find(u);
int pv = Find(v);
if (pu == pv) return false;

if (sz[pu] < sz[pv])


{
parent[pu] = pv;
sz[pv] += sz[pu];
}
else
{
parent[pv] = pu;
sz[pu] += sz[pv];
}

return true;
}
void Kruskal()
{
int d = 0;
List<Edge> mst = new List<Edge>();

edges.Sort();

foreach (var e in edges)


{
if (mst.Count == n - 1)
break;

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());

Console.WriteLine("Nhap so canh cua do thi: ");


m = int.Parse(Console.ReadLine());

Console.WriteLine("Nhap cac canh cua do thi (u v w): ");


for (int i = 0; i < m; i++)
{
string[] input = Console.ReadLine().Split();
int u = int.Parse(input[0]);
int v = int.Parse(input[1]);
int w = int.Parse(input[2]);
edges.Add(new Edge(u, v, w));
}
}
public static void Main(string[] args)
{
KruskalMST mst = new KruskalMST();

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.

You might also like