/*
生成树是指保证顶点的连通性的情况下,边尽可能的少,n个顶点的生成树的边数为n-1;
最小生成树是指:生成树中权值最小的生成树。
算法:克鲁斯卡尔算法
算法思想:每次将挑出最小的边,然后若边依附的两个顶点不在同一个集合中,那么就将这两个顶点所在的集合合并。
*/
#include<iostream>
#include<algorithm>
using namespace std;
const int MAXN=100;
int father[MAXN];
int height[MAXN];
struct Edge{
int from;
int to;
int length;
bool operator< (const Edge& e) const{
return length < e.length;//定义小于号的重载函数 在结构体内定义,表明了作用域
}
};
Edge d[MAXN*MAXN];
void Initial(int n)
{
for(int i=1;i<=n;i++)
{
father[i]=i;
height[i]=0;
}
return;
}
int Find(int x)
{
if(x!=father[x])
{
father[x]=Find(father[x]);
}
return father[x];
}
void Union(int x,int y)
{
x =Find(x);
y =Find(y);
if(x!=y)
{
if(height[x]<height[y])
{
father[x]=y;
}
else if(height[x]>height[y])
{
father[y]=x;
}
else{
father[y]=x;
height[x]++;
}
}
return;
}
int Kruscal(int EdgeNumber)
{
sort(d,d+EdgeNumber);
int sum=0;
for(int i=0;i<EdgeNumber;i++)
{
int x= d[i].from;
int y=d[i].to;
int length =d[i].length;
if(Find(x)!=Find(y))
{
Union(x,y);
sum+=length;
}
}
return sum;
}
int main()
{
int n;
int number;
while(cin>>n)
{
if(n==0)
{
break;
}
number=n*(n-1)/2;
for(int i=0;i<number;i++)
{
cin>>d[i].from>>d[i].to>>d[i].length;
}
Initial(n);
int dis= Kruscal(number);
cout<<dis<<endl;
}
return 0;
}
图论02—最小生成树
最新推荐文章于 2022-04-19 15:16:33 发布