#define MAXE 11 //最大边数
#define MAXV 10 //最大顶点数
#include <iostream>
using namespace std;
#include "stdio.h"
typedef struct
{
int vex1; //边的起始顶点
int vex2; //边的终止顶点
int weight; //边的权值
int flag;
}Edge;
typedef struct
{
Edge adj[MAXE];
int arcnum,vexnum;
}Graph;
int search (Graph & g)
{
int i,j,k,min;
i=0;
while(g.adj[i].flag!=0)
i++;
k=i;
min=g.adj[i].weight;
for(j=i+1;j<g.arcnum;j++)
{
if(g.adj[j].weight<min&&g.adj[j].flag==0)
{
min=g.adj[j].weight;
k=j;
}
}
return k;
}
void create(Graph & g)
{
int i,j,k,w;
cout<<"请输入图的顶点数和边数"<<endl;
cin>>g.vexnum>>g.arcnum;
cout<<"请输入图中各边的信息,按边所连接的顶点的序号和权值输入"<<endl;
for(i=0;i<g.arcnum;i++)
{
cin>>g.adj[i].vex1>>g.adj[i].vex2>>g.adj[i].weight;
g.adj[i].flag =0;
}
}
void kruskal(Graph & g)
{
int i,j,m1,m2,sn1,sn2,k;
int kk[MAXV];
for(i=0;i<g.vexnum;i++) //初始化辅助数组
kk[i]=i;
j=0;
while(j < g.vexnum-1) //生成的边数小于e时继续循环
{
k=search(g);
m1=g.adj[k].vex1;
m2=g.adj[k].vex2;//取一条边的两个邻接点
sn1=kk[m1];
sn2=kk[m2]; //分别得到两个顶点所属的集合编号
if(sn1!=sn2)
//两顶点分属于不同的集合,该边是最小生成树的一条边
{
printf("(v%d,v%d): %d\n",m1,m2,g.adj[j].weight);
j++; //生成边数增l
g.adj[k].flag=1;
for(i=0;i<g.vexnum;i++) //两个集合统一编号
if (kk[i]==sn2) //集合编号为sn2的改为sn1
kk[i]=sn1;
}//if
else
g.adj[j].flag =2;
}//while
}//kruskal
int main()
{
Graph g;
create(g);
kruskal(g);
return 0;
}