| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2156 人关注过本帖, 2 人收藏
标题:Kruskal算法构造的最小生成树!!高手莫笑!!
取消只看楼主 加入收藏
梧桐
Rank: 1
等 级:新手上路
帖 子:135
专家分:0
注 册:2005-11-17
收藏(2)
 问题点数:0 回复次数:0 
Kruskal算法构造的最小生成树!!高手莫笑!!

这是小弟忙了好几天做出来的!!
Kruskal
算法构造的最小生成树!!

由于是刚学数据结构,程序很不完善,算法很简单,望各位多多指教!

高手莫笑!!


源程序如下(最小生成树):


#include <stdio.h>

#include <limits.h>

#define INFINITY 0

#define MaxEdge 50

#define MAX_VERTEX_NUM 10


typedef struct { /*
图的定义*/

int vexs[MAX_VERTEX_NUM]; /* 顶点信息*/

int arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; /*以矩阵存储边的信息*/

int vexnum, e; /* 顶点数,弧数 */

}Graph;


typedef struct ENode{ /*
以数组存储边的信息*/

int vex1,vex2;

int weight;

}ENode;


Graph G;

ENode edgelist[MaxEdge],temp;

void CreateGraph(Graph G,int a,int b){

int i,j,k;
int start,end,weight;

k=0;
G.vexnum=a; G.e=b;

for(i=0;i<a;i++)

for(j=0;j<b;j++)

G.arcs[i][j]=INFINITY;

for(i=0;i<b;i++){

printf("Intput the arcs and its weight(format:1,3,2):\n");

scanf("%d,%d,%d",&start,&end,&weight);

getchar();

G.arcs[start-1][end-1]=weight;
G.arcs[end-1][start-1]=weight;

}

for(i=0;i<b;i++) /*将矩阵中边的信息复制到edgelist */

for(j=0;j<=i;j++)

if(G.arcs[i][j]){

edgelist[k].weight=G.arcs[i][j];

edgelist[k].vex1=j+1;
edgelist[k].vex2=i+1;
k++;

}

for(i=0;i<b;i++) /*按边的权重非递减将边排序*/

for(j=i+1;j<b;j++)

if(edgelist[i].weight>edgelist[j].weight){

temp=edgelist[i];
edgelist[i]=edgelist[j];
edgelist[j]=temp;
}

}

void Kruskal_MST(ENode edgelist[],int n,int e)

{/*Kruskal算法构造最小生成树*/

int i,j,k,v1,v2,*Vset;

Vset=(int *)malloc(a*sizeof(int));

for(i=0;i<G.vexnum;i++)

Vset[i]=i;

j=0;k=0;

printf("\nThe min tree:");

while(k<a-1&&j<b-1){

v1=edgelist[j].vex1; v2=edgelist[j].vex2;

if( Vset[v1]!=Vset[v2]){

printf("\n(%d,%d),%d",v1,v2,edgelist[j].weight);

k++;

for(i=0;i<a;i++)

if(Vset[i]==Vset[v2]) Vset[i]=Vset[v1];

}

j++;

}

if(k<a-1)

printf("\nError! Can not creat the min tree!");

free(Vset);

return;

}

void main(){

char j='y';
int a,b;

clrscr(); /*清屏*/

while(j!='N'&&j!='n'){

printf("\nPlease input the numbers of vex and edge(format:3,3):\n");

scanf("%d,%d",&a,&b);

CreateGraph(G,a,b);

Kruskal_MST(edgelist,a,b);

getchar();

printf("\ncontinue(Y/N)?");

scanf("%c",&j);

}

}

搜索更多相关主题的帖子: 成树 Kruskal 算法 构造 小生 
2005-12-09 20:06
快速回复:Kruskal算法构造的最小生成树!!高手莫笑!!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015197 second(s), 8 queries.
Copyright©2004-2025, BCCN.NET, All Rights Reserved