kruskal最小生成树问题

来源:互联网 发布:sql delete多个表 编辑:程序博客网 时间:2024/06/05 02:35
/*
kruskal最小生成树问题
输入: 点的个数,边的个数 ,每条边的两端点及权值

输出: 最小生成树的边,两端点及权值 

提示:没经过大量测试,如有错误请指出,感激不尽!

*/ 
#include<iostream>
using namespace std;


const int MAX=1000;


/*边
x,y两端点
weight权值 
*/ 
struct graphNode{
int x,y;
int weight;
};


//点数组 
int vertex[MAX];
//边数组 
struct graphNode edgeNode[MAX];
//最小生成树数组 
struct graphNode minTree[MAX];
//点个数 
int vertexCount=0;
//边个数 
int edgeCount=0;




//输入点,边 
void createAdjacency(int vertexCount,int edgeCount){
int x,y,weight;

for(int k=1;k<=vertexCount;++k){
vertex[k]=0;
}
//输入边的两端点及权值,无向图仅输入一次 
for(int i=1;i<=edgeCount;++i){
x=0;
y=0;
weight=0;
cin>>x>>y>>weight;
edgeNode[i].x=x;
edgeNode[i].y=y;
edgeNode[i].weight=weight;
}
}
//把边的结构体数组排序 
void bubble_sort(){
for(int i=edgeCount;i>0;--i){
for(int j=1;j<i;++j){
if(edgeNode[j].weight>edgeNode[j+1].weight){
struct graphNode temp=edgeNode[j];
edgeNode[j]=edgeNode[j+1];
edgeNode[j+1]=temp;
}
}
}
}
//构成最小生成树 
void gameover(){
int k=1;
//一维数组点的值level不同,代表不同的集合树,0代表未在生成树中 
int level=1;
minTree[k++]=edgeNode[1];
vertex[edgeNode[1].x]=1;
vertex[edgeNode[1].y]=1;

for(int i=2;i<=edgeCount;++i){

if(vertex[edgeNode[i].x]==0 && vertex[edgeNode[i].y]==0){
vertex[edgeNode[i].x]=++level;
vertex[edgeNode[i].y]=level;
}else if(vertex[edgeNode[i].x]==vertex[edgeNode[i].y]){
continue;
}else if(vertex[edgeNode[i].x]==0){
vertex[edgeNode[i].x]=vertex[edgeNode[i].y];
}else if(vertex[edgeNode[i].y]==0){
vertex[edgeNode[i].y]=vertex[edgeNode[i].x];
}else if(vertex[edgeNode[i].x]!=vertex[edgeNode[i].y]){
for(int m=1;m<vertexCount;++m){
if(vertex[m]==vertex[edgeNode[i].y])
vertex[m]=vertex[edgeNode[i].x];
}
vertex[edgeNode[i].y]=vertex[edgeNode[i].x];
}
minTree[k++]=edgeNode[i];

if(k==vertexCount)break;
}
}


void print(int n){
for(int i=1;i<n;++i){
cout<<"minTree[i].x="<<minTree[i].x <<"  minTree[i].y="<<minTree[i].y<<"  minTree[i].weight="<<minTree[i].weight<<endl;


}
}


int main(){

//输入点的个数,边的个数 
cin>>vertexCount>>edgeCount;

createAdjacency(vertexCount,edgeCount);

bubble_sort();

gameover();

print(vertexCount);

return 0;
}
 
0 0
原创粉丝点击