您的位置:首页 > 理论基础 > 数据结构算法

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

2017-05-25 17:54 411 查看
#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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: