#include<iostream>
#include<cstring>
using namespace std;
typedef char DataType;
#define MAXV 10//最大顶点数
#define MAXE 50//最大边数
typedef struct EdgeType
{
int from,to;
int weight;
} Edge;
typedef struct Graph
{
Edge elist[MAXE];
DataType vlist[MAXE];
int VNum,ENum;
} MyGraph;
void CreatGraph(MyGraph *G);
void EWeightSort(MyGraph *G);
int FindRoot(MyGraph *G,int Parent[]);
void Kruskal(MyGraph *G);
void CreatGraph(MyGraph *G)
{
int i,j,k;
cout<<"请输入图的顶点数和边数:"<<endl;
cin>>G->VNum>>G->ENum;
cout<<"请输入顶点信息:"<<endl;
for(i=0; i<G->VNum; i++)
{
cin>>G->vlist[i];
}
cout<<"请输入边(vi,vj)所依附的两个顶点及边的权值:"<<endl;
for(k=0; k<G->ENum; k++)
{
cin>>G->elist[k].from>>G->elist[k].to>>G->elist[k].weight;
}
EWeightSort(G);
}
void EWeightSort(MyGraph *G)
{
int i,j,min;
for(i=0; i<G->ENum-1; i++)
{
min=i;
for(j=i+1; j<G->ENum; j++)
{
if(G->elist[min].weight>G->elist[j].weight)
min=j;
}
swap(G->elist[i],G->elist[min]);
}
}
int FindRoot(int v,int parent[])
{
int t=v;
while(parent[t]>-1)
t=parent[t];
return t;
}
void Kruskal(MyGraph *G)
{
int i,parent[MAXV];
int num,vex1,vex2;
for(i=0; i<G->VNum; i++)
parent[i]=-1;
for(i=0; i<G->ENum; i++)
{
vex1=FindRoot(G->elist[i].from,parent);
vex2=FindRoot(G->elist[i].to,parent);
if(vex1!=vex2)
{
cout<<"("<<G->elist[i].from<<G->elist[i].to<<")"<<endl;
parent[vex2]=vex1;
num++;
if(num==G->VNum-1) return ;
}
}
}
int main()
{
MyGraph *G=new MyGraph;
CreatGraph(G);
cout<<"该图的最小生成树:"<<endl;
Kruskal(G);
return 0;
}
/*
0 1 34
0 5 19
0 2 46
1 4 12
2 3 17
2 5 25
3 5 25
3 4 38
4 5 26
*/
最小生成树-KRUSKAL算法
最新推荐文章于 2020-12-24 15:43:49 发布