#include<iostream>
using namespace std;
//该算法的时间复杂度为O(elge);Kruskal算法的时间主要取决于边数,它较适合于稀疏图。
#define MAX_VERTEX_SIZE 15
#define MAX_EDGE_SIZE 15
typedef char vertex;
typedef struct edge
{
int m;
int n;
int w;
}edge,*pEdge;
typedef struct Graph
{
edge e[MAX_EDGE_SIZE+1];
vertex v[MAX_VERTEX_SIZE+1];
int vnum,linenum;
}Graph,*G;
int indexof(G &g,vertex c)
{
for(int i=1;i<=g->vnum;i++)
{
if(c==g->v[i])
return i;
}
return -1;
}
void sort(G &g)
{
for(int i=1;i<g->linenum;i++)
{
for(int j=i+1;j<=g->linenum;j++)
{
if(g->e[j].w<g->e[i].w)
{
swap(g->e[i],g->e[j]);
}
}
}
}
void create_graph(G &g)
{
vertex a,b;
int ind1,ind2;
g=(G)malloc(sizeof(Graph));
cout<<"请输入顶点的数目"<<endl;
cin>>g->vnum;
for(int i=1;i<=g->vnum;i++)
{
cout<<"请输入第"<<i<<"个顶点"<<endl;
cin>>g->v[i];
}
cout<<"请输入边的数目"<<endl;
cin>>g->linenum;
for(int i=1;i<=g->linenum;i++ )
{
cout<<"请输入第"<<i<<"条边的顶点"<<endl;
cin>>a;
cin>>b;
ind1=indexof(g,a);
ind2=indexof(g,b);
g->e[i].m=ind1;
g->e[i].n=ind2;
cout<<"请输入第"<<i<<"条边的权值"<<endl;
cin>>g->e[i].w;
}
//打印创建的边信息
cout<<"创建的边信息:"<<endl;
for(int i=1;i<=g->linenum;i++)
{
cout<<g->e[i].m<<" "<<g->e[i].n<<" "<<g->e[i].w<<endl;
}
//根据权值由低到高对边进行排序
sort(g);
cout<<"排序后的边信息:"<<endl;
for(int i=1;i<=g->linenum;i++)
{
cout<<g->e[i].m<<" "<<g->e[i].n<<" "<<g->e[i].w<<endl;
}
}
void kruskal(G &g)
{
int vp[MAX_VERTEX_SIZE];//vp里面存放不同连通分量的标签
int result[MAX_EDGE_SIZE];//加入生成树的边为1,初始化为0
int m,n,tmp;
for(int i=1;i<=g->vnum;i++)
{
vp[i]=i;//初始时各个连通分量均不相同
}
for(int i=1;i<=g->linenum;i++)
{
result[i]=0;
}
for(int i=1;i<=g->linenum;i++)
{
m=g->e[i].m;
n=g->e[i].n;
if(vp[m]!=vp[n])
{
tmp=vp[n];
for(int j=1;j<=g->vnum;j++)
{
if(vp[j]==tmp)
{
vp[j]=vp[m];
}
}
result[i]=1;
}
}
cout<<"输出结果 result:"<<endl;
for(int i=1;i<=g->linenum;i++)
{
cout<<result[i]<<" ";
}
cout<<endl;
cout<<"输出结果 vp:"<<endl;
for(int i=1;i<=g->vnum;i++)
{
cout<<vp[i]<<" ";
}
cout<<endl;
}
void main()
{
G g;
create_graph(g);
system("pause");
kruskal(g);
system("pause");
}
最小生成树的 克鲁斯卡尔算法
最新推荐文章于 2022-11-25 11:22:18 发布