#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;
}
Kruskal算法
最新推荐文章于 2024-06-15 09:15:00 发布