1. 程式人生 > >C++ 最小生成樹之Prim(普里姆)演算法

C++ 最小生成樹之Prim(普里姆)演算法

鄰接矩陣版:
const int INF = 1000000000;

/*Prim演算法求無向圖的最小生成樹,返回最小生成樹的邊權之和*/
int Prim(int n, int s, vector<vector<int>> G, vector<bool>& vis, vector<int>& d)
{
       /*
       param
       n:                                     頂點個數
       s:                                     初始點
       G:                                     圖的鄰接矩陣
       vis:                                   標記頂點是否已被訪問
       d:                                     儲存頂點與集合S的最短距離
       return:                                最小生成樹的邊權之和
       */
       fill(d.begin(), d.end(), INF);                                        //初始化最短距離,全部為INF
       d[s] = 0;                                                             //初始點與集合S的距離為0
       int sum = 0;                                                          //記錄最小生成樹的邊權之和
       for (int i = 0; i < n; ++i)
       {
              int u = -1;                                                    //u使得d[u]最小
              int MIN = INF;                                                 //記錄最小的d[u]
              for (int j = 0; j < n; ++j)                                    //開始尋找最小的d[u]
              {
                     if (vis[j] == false && d[j] < MIN)
                     {
                           MIN = d[j];
                           u = j;
                     }
              }
              //找不到小於INF的d[u],則剩下的頂點與集合S不連通
              if (u == -1)
                     return -1;
              vis[u] = true;                                                  //標記u為已訪問
              sum += d[u];                                                    //將與集合S距離最小的邊加入到最小生成樹
              for (int v = 0; v < n; ++v)
              {
                     //v未訪問 && u能夠到達v && 以u為中介點可以使v離集合S更近
                     if (vis[v] == false && G[u][v] != INF && G[u][v] < d[v])
                           d[v] = G[u][v];                                    //更新d[v]
              }
       }
       return sum;                                                            //返回最小生成樹的邊權之和
}