您的位置:首页 > 其它

最小生成树(二)...Kruskal算法

2016-06-10 11:00 351 查看
Kruskal算法

简单说明一下该算法

该算法就是不断向一个集合里不断加最短边,然后通过并查集判断是否可以加入此最短边。

typedef struct{

int x,y,len;

} Edge //这个结构体定义了一条边,其中x,y代表这个边的两个顶点,len代表这条边的长度

//当将所有边都记录在这样结构的数组中后,对这个数组进行按边的大小排序。

sort(Edge)

//假设有n个顶点,所以需要加入n-1条边,然后从边集合里依次判断能否加入,直到加入了n-1条边

#include<iostream>
#include<algorithm>
using namespace std;
#define MAX 200  // denote the maximun number of the vertexs

struct Edge{
int x,y,len,flag;
};

Edge E[MAX*MAX/2];
int len=0,ans=0,d[MAX],g[MAX][MAX];

bool cmp(Edge,Edge);
int Find(int x,int *a);
void Union(int x,int y,int *a);
bool isNconnected(int x,int y,int *a);

int main(){
int n;
while(cin>>n){
for(int i=0;i<n;++i)
for(int j=0;j<n;++j)
cin>>g[i][j];

for(int i=0;i<n;++i)
for(int j=0;j<i;++j){
E[len].x = i,E[len].y = j,E[len].len = g[i][j];
len++;
}

sort(E,E+len,cmp);
for(int i=0;i<n;++i)d[i] = i;
for(int j=0,i=0;j<n-1&&i<len;++i){
if(isNconnected(E[i].x,E[i].y,d)){
Union(E[i].x,E[i].y,d);
ans+=E[i].len , ++j;
}
}
cout<<ans<<endl;

}
return 0;
}

bool cmp(Edge x,Edge y){
return x.len<y.len;
}

int Find(int x,int *a){
if(a[x] == x)return x;
return a[x] = Find(a[x],a);
}

void Union(int x,int y,int *a){
int i = Find(x,a), j = Find(y,a);
a[i] = j;
}

bool isNconnected(int x,int y,int *a){
return Find(x,a) != Find(y,a);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: