Kruskal 算法;
依次寻找不同集合中得最小边,加一条边,集合的个数减一,加了n-1条边,集合最终变成一个集合。可以利用并查集,得到边的两个顶点是否在同一集合上。
#include<iostream>
#include<algorithm>
using namespace std;
const int MaxN =101;
int Tree[MaxN];
int FindRoot(int x)
{
if(Tree[x] ==-1) return x;
else {
int tmp=FindRoot(Tree[x]);
Tree[x] = tmp;
return tmp;
}
}
struct Edge{
int a;
int b;
int w;
};
bool cmp(Edge e1,Edge e2)
{
return e1.w<e2.w;
}
int main()
{
int N;
while(cin>>N)
{
for(int i=1;i<=N;i++)
Tree[i]=-1;
Edge edge[MaxN*MaxN];
for(int i=0;i<N*(N-1)/2;i++)
{
cin>>edge[i].a>>edge[i].b>>edge[i].w;
}
sort(edge,edge+N*(N-1)/2,cmp);
int ans=0;
int cnt=N-1;
for(int i=0;i<N*(N-1)/2;i++)
{
edge[i].a = FindRoot(edge[i].a);
edge[i].b =FindRoot(edge[i].b);
if(edge[i].a!=edge[i].b)
{
Tree[edge[i].a]=edge[i].b;
ans+=edge[i].w;
cnt--;
if(!cnt) break;
}
}
cout<<ans<<endl;
}
}