思想參考:
總結一下:
如果選 0為起點,low_cost[i]表示以 0這個起點到i 這個終點的權值,我們找最小的權值的終點i,然後以i為起點,去更新low_cost這個陣列,如果與i相連的數是j,現在有兩種情況,j與0相連,j與i相連但不與0相連。如果j也與0相連,我們找0到j和i到j這兩者的最小距離,然後用這個最小的距離更新low_cost[j]。如果j不與0相連,那麼就直接填上low_cost[j]
**分析一下:
matrix[i][j]=m意思是以i為起點j為終點的權值為m
path[i]=a,意思是i起點連的是a終點
由此我們可見陣列可以表達的意思可以是那幾個變數之間的相關性
visit陣列存的是目前最小生成樹上已經有的結點,我們最小生成樹最終是要有所有的結點的
先找乙個起點,然後把與起點相連的路徑都存到low_cost裡
找乙個終點,起點到他的權值最小,將這個終點進行標記(證明已經將其加入到最小生成樹裡面了),並且記錄最小路徑和的sum要加上他的權值
由於low_cost目前只存了與起點相連的路徑,現在最小生成樹裡面加入了乙個新的結點,那麼我們就需要更新low_cost陣列,把與這個新的結點相連的路徑加入到low_cost陣列裡,路徑就要考慮終點,這個終點一定不是在最小生成樹里的,所以要用到visit陣列,然後如果matrix[min_cost_index][j]就是這個新節點到某一終點的權值比low_cost[j]小的話,就更新low_cost[j]
#include
using namespace std;
int matrix[
100]
[100];
// 鄰接矩陣
bool visited[
100]
;// 標記陣列
int low_cost[
100]
;// 邊的權值
int path[
100]
;// 記錄生成樹的路徑
int source;
// 指定生成樹的起點
int vertex_num;
// 頂點數
int edge_num;
// 邊數
int sum;
// 生成樹權和
void
prim
(int source)
int min_cost;
// 權值最小
int min_cost_index;
// 權值最小的下標
sum =0;
for(
int i =
1; i < vertex_num; i++
)// 除去起點,還需要找到另外 vertex_num-1 個點
} visited[min_cost_index]
= true;
// 該點已找到,進行標記
sum +
= low_cost[min_cost_index]
;// 更新生成樹權和
for(
int j =
0; j < vertex_num; j++
)// 從找到的最小下標更新 low_cost 陣列}}
}int
main()
cout <<
"請輸入起點(<"
<< vertex_num <<
"):"
; cin >> source;
prim
(source)
; cout <<
"最小生成樹權和為:"
<< sum << endl;
cout <<
"最小生成樹路徑為:\n"
;for
(int i =
0; i < vertex_num; i++)if
(i != source)
cout << i <<
"----"
<< path[i]
<< endl;
return0;
}/*請輸入圖的頂點數(<=100):5
請輸入圖的邊數:7
請輸入邊的資訊:
0 1 8
0 2 3
0 3 2
1 3 3
3 2 4
2 4 1
3 4 5
請輸入起點(<5):0
最小生成樹權和為:9
最小生成樹路徑為:
1----3
2----0
3----0
4----2
*/
不過上面這個適合理解不適合去作為模板
因為往往下標從一開始
這有乙個模板
#include
#include
#include
using namespace std;
#define n 150
#define inf 99999999
int ma[n]
[n];
long
long d[n]
,vis[n]
;int n;
long
long
prim
(int s)
vis[v]=1
; ans+
=maxn;
for(
int j=
1; j<=n; j++)if
(!vis[j]
&&ma[v]
[j]) d[j]
=ma[v]
[j];
}return ans;
}main那裡面
先輸入陣列ma
然後long
long ans=
prim(1
);printf
("%lld\n"
,ans)
;
最小生成樹(prim演算法)
最小生成樹是資料結構中圖的一種重要應用,它的要求是從乙個帶權無向完全圖中選擇n 1條邊並使這個圖仍然連通 也即得到了一棵生成樹 同時還要考慮使樹的權最小。prim演算法要點 設圖g v,e 其生成樹的頂點集合為u。把v0放入u。在所有u u,v v u的邊 u,v e中找一條最小權值的邊,加入生成樹...
最小生成樹 Prim演算法
prim 演算法 以領接矩陣儲存 圖g bool b i 表示頂點i是否被訪問,初始化時候memset b,false,sizeof b b 0 value,表示從第0個節點開始。用value i 表示節點i到最小生成樹a中定點的最小距離。例如value 1 a 0 1 int sum記錄權值和 i...
最小生成樹 prim 演算法
一 演算法描述 假設存在連通帶權圖g v,e 其中最小生成樹為t,首先從圖中隨意選擇一點s屬於v作為起始點,並將其標記後加入集合u 中。然後演算法重複執行操作為在所有v屬於u,u屬於v u的邊 v0,u0 屬於e中找一條代價最小的邊並加入集合t,同時將u0併入u,直到u v為止。這是,t中必有n 1...