最小生成树(prim算法)

最小生成树是数据结构中图的一种重要应用,它的要求是从一个带权无向完全图中选择n-1条边并使这个图仍然连通(也即得到了一棵生成树),同时还要考虑使树的权最小。

prim算法要点:设图G =(V,E),其生成树的顶点集合为U。
      ①、把v0放入U。

②、在所有u∈U,v∈V-U的边(u,v)∈E中找一条最小权值的边,加入生成树。

③、把②找到的边的v加入U集合。如果U集合已有n个元素,则结束,否则继续执行②。
      其算法的时间复杂度为O(n^2)

代码说明几点:

lowedge[]用来保存集合V-U中各顶点与集合U中顶点最短边的权值,lowedge[v]=0表示顶点v已加入最小生成树中;

midnum[]用来保存依附于该边在集合U中的顶点。

 

#includeusing namespace std;

#define MaxNum 500

#define INF 99999

typedef int EdgeType;

typedef struct MGraph

{

  EdgeType Map[MaxNum][MaxNum];

  int num,e;

};

void CreatMGraph(MGraph & G)

{

   int i,j,k,n;

   cout<<"请输入顶点数与边数:";

   cin>>G.num>>G.e;

   for(i=0;i< P>

     for(j=0;j< P>

     {

       G.Map[i][j]=INF;

       if(i==j)

         G.Map[i][j]=0;

     }

   //无向图的建立

   cout<<"请输入两端点的序号和相应的权值:"<< P>

   for(k=0;k< P>

   {

     cin>>i>>j>>n;

     G.Map[i][j]=n;

     G.Map[j][i]=n;

   }

}

int MinEdge(int lowedge[],int n) //找代价最小的边

{

    int i,k,min=INF;

    for(i=0;i< P>

    {

      if(lowedge[i]

      {

        min=lowedge[i];

        k=i;

      }

    }

    return k;

}

int prim(MGraph & G,int lowedge[],int midnum[])

{

  int i,j,k,begin=0,MSN=0;

  for(i=1;i< 初始化辅助数组>

  {

    lowedge[i]=G.Map[0][i];                 

    midnum[i]=0;

  }

  lowedge[begin]=0;

  for(i=1;i< P>

  { 

     k=MinEdge(lowedge,G.num);

     MSN+=lowedge[k];

     cout<<"("<<<"->"<<<")"<<

     lowedge[k]=0; //第K个顶点并入U

     for(j=0;j< P>

     {

       if(G.Map[k][j]< 新顶点并入U后重新选择最小边>

       {

         lowedge[j]=G.Map[k][j];

         midnum[j]=k;

       }

     }

  }

  return MSN;

}

int main()

{

  MGraph GM;

  int lowedge[MaxNum],midnum[MaxNum];

  CreatMGraph(GM);

  cout<<

  system("pause");

  return 0;

}

最小生成树-Prim算法  - ccsu_wyw - ccsu_wyw

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值