kruskal算法-最小生成樹

#include
using namespace std;


int f[101]; //存放每個點所在的樹的根節點


struct h  //線段
{
int x;  //點1
int y;  //點2
int z;  //長度
}a[101];


void quicksort(h a[], int low, int high) //快排 從小到大排出邊的長度
{
if (low < high)
{
int i = low;
int j = high;
while (i < j)
{
if (i < j&&a[j].z >= a[low].z) j--;
if (i < j&&a[i].z <= a[low].z) i++;
swap(a[i], a[j]);
}
if (i == j) swap(a[i], a[low]);
quicksort(a, low, i - 1);
quicksort(a, i + 1, high);
}
}


void inti(int f[], int m)  //初始化 每個點都是獨立的樹
{
for (int i = 1; i <= m; i++) f[i] = i;
}


int getf(int f[], int x) //獲取根節點
{
if (f[x] == x) return x;
else
{
f[x] = getf(f, f[x]);
return f[x];
}
}


int merge(int f[], int v, int u) //並查集
{
int t1 = getf(f, v);
int t2 = getf(f, u);
if (t1 != t2)         //兩者的根節點不同 則通過靠左原則合併
{
f[t2] = t1;
return 1;
}
else return 0;


}


int main()
{
int m;
int n;
while(cin>>m>>n) 
{
if (n < m - 1) cout << "不符合要求!!!" << endl;  //情況一:有的點沒有其他任何點有連線 不符合


else
{
int sum = 0;
for (int i = 1; i <= n; i++)
{
cin >> a[i].x >> a[i].y >> a[i].z;
sum += a[i].z;
}
if (m - 1 == n) cout << "最短長度是:" << sum << endl; //恰好 
else //核心情況
{
int leng = 0;
int count = 0;
quicksort(a, 1, n);
inti(f, n);
for (int i = 1; i <= n; i++)
{
if (merge(f, a[i].x, a[i].y))
{
count++;
leng += a[i].z;
}
if (count == n - 1) break;
}
cout << "最短長度是:" << leng << endl;
cout << endl;
}
}
}
return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章