标签:
最小生成树的kruskal算法
要点:并查集合 数组 完全图 边数 n*(n-1)/2
Tree[N];
数据结构设计:
Struct node{
Int a;
Int b;
Int cost;
Bool operator< (cosnt node &a)cosnt{// kruskal算法要点是每次找到最短的一条边看是否能够加入最小生成树的集合中,因此要对边排序
Return cost < a.cost;
}
}Edge[1000];
Int findroot (int x){ // 求x的根,看两个点是否在同一集合中,用来判断是否有回路
If(Tree[x] == -1) return x;
Else{
Int tmp = findroot(array[x]);
Array[x] = tmp; //路径压缩
Return tmp;
}
Kruskal 算法
Sort(Edge[]);
Int ans = 0;
For(int i = 0; i < n*(n-1)/2; i++){
Int x = findroot(Edge[i].a);
Int y = findroot(Edge[i].b);
If(x != y) { // 两个边不在同一集合中,不构成回路
Tree[x] = y;
Ans += Edge[i].cost; //将边的耗费加到集合中
}
详细代码
输入;定点数 边 边大小
输出:最小生成树的耗费
#include <stdio.h>
#include <algorithm>
int Tree[100];
using namespace std;
int findroot(int x){
if(Tree[x] == -1) return x;
else{
int tmp = findroot(Tree[x]);
Tree[x] = tmp;
return tmp;
}
}
struct node{
int a;
int b;
int cost;
bool operator< (const node &a) const{
return cost < a.cost;
}
}Edge[1000];
int main(){
int n;
int ans = 0;
scanf("%d",&n);
for(int i = 1; i <= n; i++){
Tree[i] = -1;
}
for(int j = 1; j <= n*(n-1)/2; j++){
scanf("%d%d%d",&Edge[j].a,&Edge[j].b,&Edge[j].cost);
}
sort(Edge+1,Edge+n*(n-1)/2+1);
for(int j = 1; j <= n*(n-1)/2; j++){
int x = findroot(Edge[j].a);
int y = findroot(Edge[j].b);
if(x != y) {
Tree[x] = y;
ans += Edge[j].cost;
}
}
printf("%d\n",ans);
return 0;
}
标签:
原文地址:http://www.cnblogs.com/jerrmylei/p/4355397.html