日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++ 实现无向图的最小生成树Prim算法(附完整代码)

發布時間:2023/12/4 c/c++ 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++ 实现无向图的最小生成树Prim算法(附完整代码) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

實現Prim算法,需設置兩個輔助一維數組lowcost和closevertex。

  • 其中lowcost用來保存集合V-U中各頂點與集合U中各頂點構成的邊中具有最小權值的邊的權值;
  • 數組closevertex用來保存依附于該邊的在集合U中的頂點。
  • 過程:
    假設初始狀態時,U={u0}(u0為出發的頂點),這時有lowcost[0]=0,它表示頂點u0已加入集合U中,數組lowcost的其他各分量的值是頂點u0到其余各頂點所構成的直接邊的權值。
    然后不斷選取權值最小的邊(ui,uk)(ui∈U,uk∈V-U),每選取一條邊,就將lowcost(k)置為0,表示頂點uk已加入集合U中。
    由于頂點uk從集合V-U進入集合U后,這兩個集合的內容發生了變化,就需依據具體情況更新數組lowcost和closevertex中部分分量的內容。
    最后closevertex中即為所建立的最小生成樹。

    當無向網采用二維數組存儲的鄰接矩陣存儲時,Prim算法的C++實現算法如下:

    void MGraph::Min_Tree_Prim(int u) {for (int i = 0; i < vertexnum; i++)if (i != u){close_edge[i].adjvertex = u;close_edge[i].lowcost = arcs[u][i];}close_edge[u].lowcost = 0;int k;for (int i = 0; i < vertexnum - 1; i++){int w = MAXW;for (int j = 0; j < vertexnum; j++){if (close_edge[j].lowcost != 0 && close_edge[j].lowcost < w){w = close_edge[j].lowcost;k = j;}}close_edge[k].lowcost = 0;for (int j = 0;j<vertexnum;j++)if (arcs[k][j] < close_edge[j].lowcost){close_edge[j].adjvertex = k;close_edge[j].lowcost = arcs[k][j];}}for (int i = 0; i < vertexnum; i++)if (i != u)cout << i << "->" << close_edge[i].adjvertex << "," << arcs[i][close_edge[i].adjvertex] << endl; }

    完整代碼如下:

    #include <iostream> #include <queue> using namespace std; typedef int VertexType; typedef int EdgeType; const int MaxVertexNum = 30; const int MAXW = 1e8;class closEdge {friend class MGraph; private:int adjvertex;int lowcost; };class MGraph { public:MGraph(){CreatGraph();};void Min_Tree_Prim(int u);void CreatGraph();void Visit(int v);void BFS(int v);void BFStraverse();void DFStraverse();bool Ispath_BFS(int i, int j);//判斷結點i和結點j之間是否有路徑bool Ispath_DFS(int i, int j);//判斷結點i和結點j之間是否有路徑void Init_vis(); private:void DFS(int i, int j, bool &flag);void dfs_graph(int i);VertexType vertexs[MaxVertexNum];EdgeType arcs[MaxVertexNum][MaxVertexNum];int vertexnum;int edgenum;closEdge close_edge[MaxVertexNum];bool vis[MaxVertexNum]; };void MGraph::Min_Tree_Prim(int u) {for (int i = 0; i < vertexnum; i++)if (i != u){close_edge[i].adjvertex = u;close_edge[i].lowcost = arcs[u][i];}close_edge[u].lowcost = 0;int k;for (int i = 0; i < vertexnum - 1; i++){int w = MAXW;for (int j = 0; j < vertexnum; j++){if (close_edge[j].lowcost != 0 && close_edge[j].lowcost < w){w = close_edge[j].lowcost;k = j;}}close_edge[k].lowcost = 0;for (int j = 0;j<vertexnum;j++)if (arcs[k][j] < close_edge[j].lowcost){close_edge[j].adjvertex = k;close_edge[j].lowcost = arcs[k][j];}}for (int i = 0; i < vertexnum; i++)if (i != u)cout << i << "->" << close_edge[i].adjvertex << "," << arcs[i][close_edge[i].adjvertex] << endl; }void MGraph::CreatGraph() {Init_vis();cout << "請輸入圖的頂點個數和邊的條數" << endl;cin >> vertexnum >> edgenum;cout << "請依次輸入按序號0到n頂點的中存儲的信息" << endl;for (int i = 0; i < vertexnum; i++) cin >> vertexs[i];for (int i = 0; i < vertexnum; i++)for (int j = 0; j < vertexnum; j++)arcs[i][j] = MAXW;cout << "請輸入邊的信息(該圖以有向圖的鄰接矩陣存儲方式存儲)" << endl;for (int i = 0; i < edgenum; i++){int a1, a2, w;cout << "輸入邊<i,j>對應的頂點序號i,j,然后再輸入該邊的權值" << endl;cin >> a1 >> a2>>w;arcs[a1][a2] = w;arcs[a2][a1] = w;} }void MGraph::Init_vis() {for (int i = 0; i < MaxVertexNum; i++) vis[i] = false; }void MGraph::Visit(int v) {cout << vertexs[v] << " "; }void MGraph::BFS(int v) {queue<int >q;q.push(v);vis[v] = true;while (q.size()){int t = q.front();Visit(t);q.pop();for (int i = 0; i < vertexnum; i++){if (arcs[t][i] == 1 && vis[i] == false){vis[i] = true;q.push(i);}}}cout << endl;Init_vis(); }void MGraph::BFStraverse() {queue<int >q;for (int i = 0; i < vertexnum; i++){if (vis[i] == false){vis[i] = true;q.push(i);while (q.size()){int t = q.front();Visit(t);q.pop();for (int j = 0; j < vertexnum; j++)if (arcs[t][j] == 1 && vis[j] == false){vis[j] = true;q.push(j);}}}}cout << endl;Init_vis(); }void MGraph::dfs_graph(int i) {Visit(i);for (int j = 0; j < vertexnum; j++){if (arcs[i][j] == 1 && vis[j] == false){vis[j] = true;dfs_graph(j);}} }void MGraph::DFStraverse() {for (int i = 0; i < vertexnum; i++){if (vis[i] == false){vis[i] = true;dfs_graph(i);}}cout << endl;Init_vis(); }bool MGraph::Ispath_BFS(int i, int j) {queue<int >q;vis[i] = true;q.push(i);while (q.size()){int t = q.front();q.pop();if (t == j){Init_vis();return true;}for (int k = 0; k < vertexnum; k++){if (arcs[t][k] == 1 && vis[k] == false){vis[k] = true;q.push(k);}}}Init_vis();return false; }void MGraph::DFS(int i, int j, bool &flag) {if (i == j){flag = true;return;}for (int k = 0; k < vertexnum; k++){if (arcs[i][k] == 1 && vis[k] == false){vis[k] = true;DFS(k, j, flag);vis[k] = false;}} }bool MGraph::Ispath_DFS(int i, int j) {bool flag = false;vis[i] = true;DFS(i, j, flag);Init_vis();if (flag) return true;else return false; }int main() {MGraph g;int v;cin >> v;g.BFS(v);g.BFStraverse();g.DFStraverse();int n;cin >> n;g.Min_Tree_Prim(n);return 0; }

    測試結果:

    總結

    以上是生活随笔為你收集整理的C++ 实现无向图的最小生成树Prim算法(附完整代码)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。