/// <summary> /// Tìm cây khung nhỏ nhất theo thuật toán Kruskal /// </summary> /// <param name="a">Mảng chứa danh sách kề</param> /// <param name="n">Số đỉnh</param> static void Kruskal(int[,] a, int n) { EdgeCollection list = matrix_edge_convert(a, n); list.Sort(); EdgeCollection listResult = new EdgeCollection(); //danh dau nhan i cho dinh i int[] label = new int[n]; for (int i = 0; i < n; i++) { label[i] = i; } int lab1 = 0; int lab2 = 0; foreach (Edge item in list) { if (label[item.start.Index] != label[item.end.Index]) { listResult.Add(item); if (label[item.start.Index] > label[item.end.Index]) { lab1 = label[item.end.Index]; lab2 = label[item.start.Index]; } else { lab2 = label[item.end.Index]; lab1 = label[item.start.Index]; } for (int i = 0; i < n; i++) { if (label[i] == lab2) { label[i] = lab1; } } } } foreach (Edge item in listResult) { Console.WriteLine(item.ToString()); } }
/// <summary> /// Tìm cây khung nhỏ nhất theo thuật toán Krukal /// </summary> public EdgeCollection Kruskal() { Reset(); EdgeCollection listResult = new EdgeCollection(); _edgeList.Sort(); //danh dau nhan i cho dinh i int[] label = new int[n]; for (int i = 0; i < n; i++) { label[i] = i; } int lab1 = 0; int lab2 = 0; foreach (Edge item in _edgeList) { if (label[item.start.Index] != label[item.end.Index]) { listResult.Add(item); if (label[item.start.Index] > label[item.end.Index]) { lab1 = label[item.end.Index]; lab2 = label[item.start.Index]; } else { lab2 = label[item.end.Index]; lab1 = label[item.start.Index]; } for (int i = 0; i < n; i++) { if (label[i] == lab2) { label[i] = lab1; } } } } return(listResult); }