最小生成树算法 prim算法

来源:互联网 发布:淘宝一千保证金怎么退 编辑:程序博客网 时间:2024/06/10 20:51
最小生成树是数据结构中图的一种重要应用,它的要求是从一个带权无向完全图中选择n-1条边并使这个图仍然连通(也即得到了一棵生成树),

同时还要考虑使树的权最小。 prim算法就是一种最小生成树算法。


普里姆算法的基本思想:

从连通网N={V,E}中的某一顶点U0出发,选择与它关联的具有最小权值的边(U0,v),将其顶点加入到生成树的顶点集合U中。以后每一步从一个顶点在U中,而另一个顶点不在U中的各条边中选择权值最小的边(u,v),把它的顶点加入到集合U中。如此继续下去,直到网中的所有顶点都加入到生成树顶点集合U中为止。


下面举例说明下prim算法:










例题:poj 2485

    #include <iostream>      using namespace std;            #define INF 70000            int N;//点的数目      int key[500];      bool flag[500];      int A[500][500];            int Prim(int r)      {          int result=0;          for(int i=0;i<N;i++)          {              key[i]=INF;              flag[i]=true;          }          key[r]=0;          for(int i=0;i<N;i++)          {              int min_num=INF;              int min;              for(int j=0;j<N;j++)              {                  if(flag[j] && min_num>key[j])                  {                      min_num=key[j];                      min=j;                  }              }              flag[min]=false;              if(result<key[min])                  result=key[min];              for(int j=0;j<N;j++)              {                  if(flag[j] && A[min][j] < key[j])                      key[j]=A[min][j];              }          }          return result;      }            int main()      {          int T;          cin >> T;          while(T--)          {              cin >> N;              for(int i=0;i<N;i++)              {                  for(int j=0;j<N;j++)                      scanf("%d",&A[i][j]);              }                 cout << Prim(0) << endl;          }      }  


0 0
原创粉丝点击