C语言-数据结构-克鲁斯卡尔kruskal

#include <stdio.h>
#include <stdlib.h>
//#include "ljjz.h"
//求解最小生成树算法
typedef struct edgedata
{
    int beg,en;///边顶点序号
    int length;///边的权值长
}edge;
///对边向量快速排序
///边向量edges边向量左右下标left right
void QuickSort(edge edges[],int left,int right)
{
    edge x;
    int i,j,flag=1;
    if(left<right)
    {
        i=left;
        j=right;
        x=edges[i];
        while(i<j)
        {
            while(i<j&&x.length<edges[j].length)
                j--;
            if(i<j)
             edges[i++]=edges[j];
             while(i<j&&x.length>edges[i].length)
                i++;
             if(i<j)
             edges[j--]=edges[i];
        }
        edges[i]=x;
        QuickSort(edges,left,i-1);
        QuickSort(edges,i+1,right);
    }
}
///从图g邻接矩形读所有边信息
///邻接矩阵g 边向量edges
void GetEdge(Mgraph g,edge edges[])
{
    int i,j,k=0;
    for(i=0;i<g.n;i++)
      for(j=0;j<i;j++)
       if(g.edges[i][j]!=0&&g.edges[i][j]<FINITY)
       {
           edges[k].beg=i;
           edges[k].en=j;
           edges[k++].length=g.edges[i][j];
       }
}
///kruskal求解最小生成树算法
void kruskal(Mgraph g)
{
    int i,j,k=0,ltfl;
    int cnvx[M];
    edge edges[M*M];  ///存放图所有边
    edge tree[M];   ///最小生成树边信息
    GetEdge(g,edges);///读取所有边
    QuickSort(edges,0,g.e-1);///对边进行升序排序
    for(i=0;i<g.n;i++)
    {
        cnvx[i]=i;   ///设置每个顶点的连通分量为顶点编号
    }
    for(i=0;i<g.n-1;i++)  ///树中g.n-1条边
    {
        while(cnvx[edges[k].beg]==cnvx[edges[k].en])
            k++;    ///找到属于两个连通分量权最小边
        tree[i]=edges[k];   ///将k边加入到生成树中
        ltfl=cnvx[edges[k].en];///记录选中边的连通分量编号
        for(j=0;j<g.n;j++)      ///两个连通分量合并一个
            if(cnvx[j]==ltfl)
                cnvx[j]=cnvx[edges[k].beg];
            k++;
    }
    printf("min tree:");
    for(j=0;j<g.n-1;j++)
    {
        printf("c---%c%6d\n",g.vexs[tree[j].beg],g.vexs[tree[j].en],tree[j].length);
    }
}
void main()
{
    Mgraph g;
    char filename[20];
    printf("please input filename of Graph:");
    gets(filename);///读取图输入文件
    creat(&g,filename,0);  ///创建邻接矩阵
    kruskal(g);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值