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;
}
#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;
}
相关文章推荐
- [数据结构]克鲁斯卡尔(Kruskal)算法
- 数据结构之---C语言实现最小生成树之kruskal(克鲁斯卡尔)算法
- 普里姆(Prim)算法和克鲁斯卡尔(Kruskal)算法
- C++ 最小生成树之kruskal(克鲁斯卡尔)算法
- Kruskal(克鲁斯卡尔)
- 【图】最小生成树(最小成本):克鲁斯卡尔(Kruskal)算法
- 最小生成树的克鲁斯卡尔(kruskal)算法
- 分量算法poj 1751 Highways 最小生成树之Kruskal(克鲁斯卡尔)算法
- 图的最小生成树---克鲁斯卡尔(Kruskal)算法
- 算法:图解最小生成树之克鲁斯卡尔(Kruskal)算法
- 畅通工程 HDU杭电1863【克鲁斯卡尔Kruskal || Prim】
- 数据结构 C语言 最小生成树 prim kruskal
- 最小生成树算法(下)——Kruskal(克鲁斯卡尔)算法
- 最小生成树(MST)----普里姆(Prim)算法与克鲁斯卡尔(Kruskal)算法
- 算法:图解最小生成树之克鲁斯卡尔(Kruskal)算法
- 最小生成树(qsort+并查集+克鲁斯卡尔(Kruskal)算法)
- 最小生成树之Kruskal(克鲁斯卡尔)算法
- 最小生成树之克鲁斯卡尔(Kruskal)算法实现,代码详解!!!!
- 关于最小生成树中的 Kruskal(克鲁斯卡尔)算法
- Kruskal(克鲁斯卡尔)