您好,登錄后才能下訂單哦!
本篇內容介紹了“Java怎么實現最小生成樹MST”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
簡單講解
圖的定義時 我們規定一個連通圖的生成樹是一個極小連通子圖 含有N個頂點N-1個邊 我們把圖中帶權的邊 最小代價生成的樹成為最小生成樹。
普里姆(Prim)算法 prim算法適合稠密圖,其時間復雜度為O(n^2),其時間復雜度與邊得數目無關以頂點找頂點 考慮權值
存儲方式為鄰接矩陣
基本思想:假設G=(V,E)是連通的,TE是G上最小生成樹中邊的集合。算法從U={u0}(u0∈V)、TE={}開始。重復執行下列操作:
在所有u∈U,v∈V-U的邊(u,v)∈E中找一條權值最小的邊(u0,v0)并入集合TE中,同時v0并入U,直到V=U為止。
此時,TE中必有n-1條邊,T=(V,TE)為G的最小生成樹。
Prim算法的核心:始終保持TE中的邊集構成一棵生成樹。
注意:prim算法適合稠密圖,其時間復雜度為O(n^2),其時間復雜度與邊得數目無關,
為了更好理解我們在這里舉一個例子,示例如下:
(1)圖中有6個頂點v1-v6,每條邊的邊權值都在圖上;在進行prim算法時,我先隨意選擇一個頂點作為起始點,當然我們一般選擇v1作為起始點,好,現在我們設U集合為當前所找到最小生成樹里面的頂點,TE集合為所找到的邊,現在狀態如下:
U={v1}; TE={};
(2)現在查找一個頂點在U集合中,另一個頂點在V-U集合中的最小權值,如下圖,在紅線相交的線上找最小值。
通過圖中我們可以看到邊v1-v3的權值最小為1,那么將v3加入到U集合,(v1,v3)加入到TE,狀態如下:
U={v1,v3}; TE={(v1,v3)};
(3)繼續尋找,現在狀態為U={v1,v3}; TE={(v1,v3)};在與紅線相交的邊上查找最小值。
我們可以找到最小的權值為(v3,v6)=4,那么我們將v6加入到U集合,并將最小邊加入到TE集合,那么加入后狀態如下:
U={v1,v3,v6}; TE={(v1,v3),(v3,v6)}; 如此循環一下直到找到所有頂點為止。
(4)下圖像我們展示了全部的查找過程:
#include<iostream> #include<fstream> using namespace std; #define MAX 100 #define MAXCOST 65535 int graph[MAX][MAX]; int Prim(int graph[][MAX], int m)//m 是點數 { int lowcost[m]; int mst[m]; int i, j, min, k, sum = 0; mst[1] = 0; lowcost[1]=0; for (i = 2; i <= m; i++) { lowcost[i] = graph[1][i]; mst[i] = 1; } for (i = 2; i <= m; i++) { min = MAXCOST; k = 0; for (j = 2; j <= m; j++) { if (lowcost[j] < min && lowcost[j] != 0) { min = lowcost[j]; k = j;//找到最小值下標 } } cout << "V" << mst[k] << "-V" << k << "=" << min << endl; sum += min; lowcost[k] = 0;//到達k的距離為0 說明這個頂點完成了任務 for (j = 2; j <= m; j++) // 更新lowcost 數組 { if (lowcost[j] != 0 && graph[k][j] < lowcost[j]) { lowcost[j] = graph[k][j];/本來到達不了 由于k的引入 可以到達了 mst[j] = k; //這是不能總是從V1開始去別的點 把 現在能找到的近距離類似 mst[k] } } } return sum; } int main() { int i, j, k, m, n; int cost; cout<<"please input V and E:"; cin >> m >> n;//m=頂點的個數,n=邊的個數 //初始化圖G for (i = 1; i <= m; i++) { for (j = 1; j <= m; j++) { graph[i][j] = MAXCOST; } } //構建圖G cout<<"please intput i j and cost:"<<endl; for (k = 1; k <= n; k++) { cin >> i >> j >> cost; graph[i][j] = cost; graph[j][i] = cost; } //求解最小生成樹 cost = Prim(graph, m); //輸出最小權值和 cout << "最小權值和=" << cost << endl; return 0; }
測試數據 V E
6 10
1 2 6
1 3 1
1 4 5
2 3 5
2 5 3
3 4 5
3 5 6
3 6 4
4 6 2
5 6 6
結果
V1-V3=1
V3-V6=4
V6-V4=2
V3-V2=5
V2-V5=3
最小權值和=15
請按任意鍵繼續. . .
“Java怎么實現最小生成樹MST”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。