c语言最小生成树算法克鲁斯,[求助]关于克鲁斯卡尔求最小生成树的算法源程序...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

这个是关于克鲁斯卡尔的算法 编译时出错了 大家帮帮我!

#include

#include

#define M 20

#define MAX 20

typedef struct

{

int begin;

int end;

int weight;

}edge;

typedef struct

{

int adj;

int weight;

}AdjMatrix[MAX][MAX];

typedef struct

{

AdjMatrix arc;

int vexnum, arcnum;

}MGraph;

void CreatGraph(MGraph *);

void sort(edge* ,MGraph *);

void MiniSpanTree(MGraph *);

int  Find(int *, int );

void Swapn(edge *, int, int);

void CreatGraph(MGraph *G)

{

int i, j,n, m;

printf("input the amount of edges and vexs:");

scanf("%d %d",&G->arcnum,&G->vexnum);

for (i = 1; i <= G->vexnum; i++)

{

for ( j = 1; j <= G->vexnum; j++)

{

G->arc[i][j].adj = G->arc[j][i].adj = 0;

}

}

for ( i = 1; i <= G->arcnum; i++)

{

printf("\ninput the 2 vexs of edge");

scanf("%d %d",&n,&m);

G->arc[n][m].adj = G->arc[m][n].adj = 1;

getchar();

printf("\ninput the weight between %d and %d:", n, m);

scanf("%d",&G->arc[n][m].weight);

}

printf("the alragh is:\n");

for ( i = 1; i <= G->vexnum; i++)

{

for ( j = 1; j <= G->vexnum; j++)

{

printf("%d ",G->arc[i][j].adj);

}

printf("\n");

}

}

void sort(edge edges[],MGraph *G)

{

int i, j;

for ( i = 1; i arcnum; i++)

{

for ( j = i + 1; j <= G->arcnum; j++)

{

if (edges[i].weight > edges[j].weight)

{

Swapn(edges, i, j);

}

}

}

printf("the weighe order is:\n");

for (i = 1; i arcnum; i++)

{

printf("<>   %d\n", edges[i].begin, edges[i].end, edges[i].weight);

}

}

void Swapn(edge *edges,int i, int j)

{

int temp;

temp = edges[i].begin;

edges[i].begin = edges[j].begin;

edges[j].begin = temp;

temp = edges[i].end;

edges[i].end = edges[j].end;

edges[j].end = temp;

temp = edges[i].weight;

edges[i].weight = edges[j].weight;

edges[j].weight = temp;

}

void MiniSpanTree(MGraph *G)

{

int i, j, n, m;

int k = 1;

int parent[M];

edge edges[M];

for ( i = 1; i vexnum; i++)

{

for (j = i + 1; j <= G->vexnum; j++)

{

if (G->arc[i][j].adj == 1)

{

edges[k].begin = i;

edges[k].end = j;

edges[k].weight = G->arc[i][j].weight;

k++;

}

}

}

sort(edges, G);

for (i = 1; i <= G->arcnum; i++)

{

parent[i] = 0;

}

printf("the MST is:\n");

for (i = 1; i <= G->arcnum; i++)

{

n = Find(parent, edges[i].begin);

m = Find(parent, edges[i].end);

if (n != m)

{

parent[n] = m;

printf("<>   %d\n", edges[i].begin, edges[i].end, edges[i].weight);

}

}

}

int Find(int *parent, int f)

{

while ( parent[f] > 0)

{

f = parent[f];

}

return f;

}

int main(void)

{

MGraph *G;

G = (MGraph*)malloc(sizeof(MGraph));

if (G == NULL)

{

printf("memory allcation failed,goodbye");

exit(1);

}

CreatGraph(G);

MiniSpanTree(G);

system("pause");

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值