• Kruskal算法


    #include"ljjz.h"
    typedef struct edgedata
    {
        int beg;
        int end;
        int length;
    }edge;
    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[j].length)i++;
                if(i<j)edges[j--]=edges[i];
            }
            edges[i]=x;
            QuickSort(edges,left,i-1);
            QuickSort(edges,i+1,right);
        }
    }
    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].end=j;
                edges[k++].length=g.edges[i][j];
        }
    }
    void kruskal(Mgraph g)
    {
        int i,j,k=0,ltf1;
        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].end])
                k++;
            tree[i]=edges[k];//最小边插入进树中
            ltf1=cnvx[edges[k].end];//记录当前最小边的终点
            for(j=0;j<g.n;j++)//两个连通分量合并成一个连通分量
                if(cnvx[j]==ltf1)//终点的连通分量和起点的连通分量一致
                cnvx[j]=cnvx[edges[k].beg];
            k++;//之前找到的边的两端都是在同一个连通分量
        }
        for(i=0;i<g.n-1;i++)
            printf("%c---%c%6d
    ",g.vexs[tree[i].beg],g.vexs[tree[i].end],tree[i].length);
    }
    int main()
    {
        Mgraph m ,*pm=&m;
        creat(pm,"DATA-LJJZ",0);
        kruskal(m);
        return 0;
    }
    

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    Metropolis-Hastings algorithm
    Base64编码原理
    修改远程端口号
    修改数据库配置文件
    Windows 2008下系统网站运行环境的搭建
    oracle 11 g数据库卸载(方法二)
    oracle11g的安装
    oracle 11g的卸载
    软件实施的技巧
    使用命令行快速打开系统文件
  • 原文地址:https://www.cnblogs.com/Thereisnospon/p/4768508.html
Copyright © 2020-2023  润新知