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\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; }
版权声明:本文为博主原创文章,未经博主允许不得转载。