a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 85|回复: 0

[程序员] 2012年软件水平考试程序员考点整理(10)

[复制链接]
发表于 2012-8-2 08:51:15 | 显示全部楼层 |阅读模式
 14、最小生成树算法之Prim算法(C++实现)
( S6 H, t% p+ i1 j2 `$ C3 S  在无向带权连通图G中,如不美观一个连通子树包含所有极点,而且毗连这些极点的边权之和最小,那么这个连通子图就是G的最小生成树。求最小生成树的一个常见算法是Prim算法,该算法的根基思惟是:
3 ?9 H- F8 a2 y: [+ R/ q. Z. G  1)设置两个集结V和S,肆意选择一个极点作为肇端极点,将肇端极点放入集结S,其余极点存入集结V中;$ [; b6 r  M# i7 T  I
  2)然后使用贪心策略,选择一条长度最短而且端点分袂在S和V中边(即为最小生成树的中的一条边),将这条边在V中的端点插手到集结S中;4 V9 Z8 {- p6 V0 L; H
  3)轮回执行第2)步直到S中包含了所有极点。8 p0 |0 r1 q" g+ }% Q
  按照以上思惟我们很快可以给出一个O(N^3)的算法,即选择一条最短边需要O(N^2)的时刻复杂度,具体实现代码如下:# l# T- C' f% F6 G
  ////////////////////////////////
* C7 _1 V/ d& ?  }8 o4 n# j  // O(N^3)% c$ w) ^6 W$ u+ Z4 J1 C9 h+ ~
  #include+ c; E1 @/ l, @- w
  using namespace std;5 n" C7 z/ T6 [: `% _$ {7 v
  //用邻人矩阵暗示无向图
! j6 V( D0 u: @8 Z" J2 N2 h  #define N 6 //节点个数  V. M) }. Z/ O2 o% t6 B- c3 ~
  #define M 100000//最大值,暗示不成达! t) j0 l% j2 ]2 a! w
  int matrix[N][N]=
' j# ~4 @2 P8 r$ W2 U  {) n+ \7 H: i4 l1 k
  M,6,1,5,M,M,
+ T' S' M  s& |2 ^  6,M,5,M,3,M,& i" o: X6 ?. _  O
  1,5,M,5,6,4,
2 ]. e: `! E  B  M  \  5,M,5,M,M,2,
  d- _/ ^5 g# }3 p4 S  M,3,6,M,M,6,1 j% w/ I1 Q% [  {! P& V
  M,M,4,2,6,M5 w7 [8 @' A1 u  V9 z
  };
; R8 M  d& k: d4 ~  void prim()- U5 B9 v  T7 M' W
  {
1 y" l" \  J, d  bool flag[N]; //标识表记标帜某个点是否当前生成树集结中, ?- M$ T/ `7 H( n' y& x9 X4 u
  int i,j;
3 m. H$ l  J- U# {0 c  //初始化集结
- J7 i6 ?7 d  f7 W# d! k  for(i = 0; i% F$ w6 @: z, I0 d7 ]
  flag =false;
( p" A+ G. I0 n+ y, X  h& r) E$ I6 f2 ~2 |  flag[0] = true;$ M6 e* A7 }. u3 K
  int count = 1;, J0 y) {5 k* T  X$ m; W% g  P
  while(count++< N)
* ~8 k( V; o% z$ r1 b  {
* N! ~3 i  \# \/ j$ C( w  c0 i  int min =M;
4 X' {" k, F, o& X- y  int e1 = -1,e2 = -1;
7 B" n8 w( [+ Z+ s  for(i = 0; i< N; ++i)
& U$ a% `$ U- y# s, S" U# x  {0 S% R6 H) n' ]
  if(flag)! q+ s) ?, u# ?6 ]
  {
3 f  q, s9 ?- h" t1 y  for(j= 0; j < N; ++j)7 w+ E. Q) Z2 A3 i
  {
3 O- F* N: }* H1 M& Q( r3 |: C0 B/ k  if(!flag[j])
% v5 H' N/ q# ~$ K+ e+ G$ J1 f  {$ A6 P; A7 n( p' @/ w* z: Z
  if(matrix[j] < min)0 e/ s4 ?9 r. {% k
  {/ I; |: f6 l6 ?3 W2 l7 x
  min = matrix[j];
: u% z: w' i1 T. B  e1 = i;
! x6 `, z% z$ m/ c! M  e2 = j;
5 @0 `( U) O! }5 |  K% `2 U6 R  }1 @+ ^9 t" C0 m. ^) ?0 n& K
  }: B( R# {8 C) ]$ _; j; _
  }' B7 J2 O: |, i& q% @5 J9 L
  }
' T  s1 j7 R; o6 X  }/ A9 \9 c0 W( B
  cout
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-4 02:54 , Processed in 0.197941 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表