最小生成树之Prim算法 Prim算法用于求无向图的最小生成树
" O: d3 `/ A/ s/ [' \$ {3 F/ p 设图G =(V,E),其生成树的顶点集合为U。
3 } N+ I! ~; ` ①、把v0放入U。
$ \- u2 d7 g2 \4 q! f0 q ②、在所有u∈U,v∈V-U的边(u,v)∈E中找一条最小权值的边,加入生成树。
; i8 V% h* r" o2 a; Q& a/ F ③、把②找到的边的v加入U集合。如果U集合已有n个元素,则结束,否则继续执行②。
; }: [& O- j" m. t% h4 _! v 其算法的时间复杂度为O(n^2)
$ F+ ?- o5 l4 x5 O7 V: q Prim算法实现:
/ }- \- ]1 e! v0 j9 l (1)集合:设置一个数组set(i=0,1,..,n-1),初始值为 0,代表对应顶点不在集合中(注意:顶点号与下标号差1)
4 V( i' T: C Z/ Z- C- M" A1 E (2)图用邻接阵表示,路径不通用无穷大表示,在计算机中可用一个大整数代替。0 s+ C5 x- V7 |
采用堆可以将复杂度降为O(m log n),如果采用Fibonaci堆可以将复杂度降为O(n log n + m)' ?! l8 \: b3 J) i- N1 v+ |
算法实现
7 ~! a, _4 y3 b w5 V4 d" D/ t #include9 \' V* T1 `4 t0 B' h9 d& {0 X
#define MaxNum 765432100;
j* v# N4 @, A using namespace std;% Q- l3 P, `/ h& Q6 c% v
ifstream fin("Prim.in");& V) N# Q h( h+ T. Y
ofstream fout("Prim.out");
2 z/ C. [1 M4 X' }) L5 h int p,q;
5 K2 F9 m; U/ X; c5 } bool is_arrived[501];
8 _! B/ _" H4 a4 P( J4 B7 r- P) P int Length,Vertex,SetNum,State;
; g( v' E3 ~+ t int Map[501][501],Dist[501];4 a8 v& x8 [$ x: g- f! i
int FindMin()
7 b! p! d V% D {' A8 m+ `6 h1 o2 H2 Q" E
int p;
; n4 c- ^3 ?. w; t int Minm,Temp;
' s# C" g3 U# M: ? N q Minm=MaxNum;
3 F0 T' I7 W) L4 W, v Temp=0; |