克鲁斯卡尔算法

来源:互联网 发布:上瘾网络剧全集在线 编辑:程序博客网 时间:2024/05/16 00:38
 

#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;

}

 

原创粉丝点击