Kruskal算法

来源:互联网 发布:扇形建筑算法 编辑:程序博客网 时间:2024/06/05 05:06
#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\n",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;}

0 0