别人写的比较好的一篇
什么是最小生成树:
如何求最小生成树?
A、Prim 算法(普里姆算法)(待补)
B、Kruskal 算法(克鲁斯卡算法)
理论基础:MST(证明…)
其实就是查并集的简单应用而已;
举个题:
HDU 1233
#include <bits/stdc++.h>
#define ll long long
using namespace std;
//最小生成树问题
int s[110];
struct node {int a, b, d;}c[5000];
bool cmp(node x,node y){return x.d<y.d;}
int findx(int x){//查并集中的查
while(x!=s[x])x=s[x];
return x;
}
int main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int n;
while(scanf("%d",&n),n){
int m=n*(n-1)/2;
for(int i=1;i<=m;i++)scanf("%d%d%d",&c[i].a,&c[i].b,&c[i].d);
sort(c+1,c+1+m,cmp);//排序;将边的权值从小到大排序;
for(int i=1;i<=n;i++)s[i]=i;//查并集一定的步骤:“根的初始化”
int ans=0,g=0;
for(int i=1;i<=m;i++){
if(findx(c[i].a) !=findx(c[i].b) ){//只有根节点不同才能进行;否则就不是树就成环了
ans+=c[i].d;
s[ findx(c[i].a) ]=findx(c[i].b);//合并
g++;if(g==n-1)break;//这一步可有可无;这一步剪枝;因为是树所以就是n-1条边;
}
}
printf("%d\n",ans);
}
return 0;
}