最小生成树问题



  1. ="alt">="keyword">voidPr_Vec
  2. {="comment">//输出所有点集_vec_vec
  3. ="alt">="keyword">for(="datatypes">i=0;i<_vec_vec.size;i)
  4. {
  5. ="alt">="keyword">for(="datatypes">j=0;j<_vec_vec[i].size;j)
  6. {
  7. ="alt">cout<<_vec_vec[i][j]<<="">"";
  8. }
  9. ="alt">cout<<endl;
  10. }
  11. ="alt">}
  12. ="keyword">voidKruskal(K_Chart*K,P_Chart&E)
  13. ="alt">{="comment">/*构造最小生成树Kruskal算法
  14. ="comment">输入:加权连通图K
  15. ="alt">="comment">输出:E组成G最小生成树集合*/
  16. ="keyword">for(="datatypes">i=0;i<E.pos;i)
  17. ="alt">{
  18. E.flag[i]=="keyword">false;
  19. ="alt">="keyword">for(="datatypes">j=i;j<E.pos;j)
  20. {
  21. ="alt">E.A[j][i]=E.A[i][j]=INT_MAX;
  22. }
  23. ="alt">}
  24. MSort(K,K,0,K_i-1);
  25. ="alt">="datatypes">k=0,counter=0;
  26. ="datatypes">P1;
  27. ="alt">="datatypes">P2;
  28. ="keyword">do
  29. ="alt">{
  30. P1=K[k].po.P1;
  31. ="alt">P2=K[k].po.P2;
  32. ="alt">="keyword">(E.flag[P1]="keyword">false&&E.flag[P2]

    ="keyword">false)
  33. {
  34. ="alt">E.flag[P1]=="keyword">true;
  35. E.flag[P2]=="keyword">true;
  36. ="alt">_vec.clear;
  37. _vec.push_back(P1);
  38. ="alt">_vec.push_back(P2);
  39. _vec_vec.push_back(_vec);
  40. ="alt">
  41. counter;
  42. ="alt">distance_KE.A[P1][P2]=E.A[P2][P1]=K[k].value;
  43. }
  44. ="alt">="keyword">
  45. {
  46. ="alt">="keyword">(E.flag[P1]="keyword">false||E.flag[P2]="keyword">false)
  47. {
  48. ="alt">="datatypes">i;
  49. ="alt">="keyword">(E.flag[P1]="keyword">false)
  50. {
  51. ="alt">E.flag[P1]=="keyword">true;
  52. ="comment">//
  53. ="alt">i=Find_i(P2);
  54. _vec_vec[i].push_back(P1);
  55. ="alt">}
  56. ="keyword">="comment">//(E.flag[P2]false)
  57. ="alt">{
  58. E.flag[P2]=

    ="keyword">true;
  59. ="alt">="comment">//
  60. i=Find_i(P1);
  61. ="alt">_vec_vec[i].push_back(P2);
  62. }
  63. ="alt">distance_KE.A[P1][P2]=E.A[P2][P1]=K[k].value;
  64. counter;
  65. ="alt">}
  66. ="keyword">="comment">//(E.flag[P1]true&&E.flag[P2]true)
  67. ="alt">{
  68. ="datatypes">P1_i=Find_i(P1);
  69. ="alt">="datatypes">P2_i=Find_i(P2);
  70. ="keyword">(P1_i!=P2_i)
  71. ="alt">{
  72. ="keyword">(_vec_vec[P1_i].size>_vec_vec[P2_i].size)
  73. ="alt">{
  74. ="keyword">for(="datatypes">i=0;i<_vec_vec[P2_i].size;i)
  75. ="alt">{
  76. _vec_vec[P1_i].push_back(_vec_vec[P2_i][i]);
  77. ="alt">}
  78. _vec_vec.erase(_vec_vec.begin+P2_i);="comment">//删除点集
  79. ="alt">}
  80. ="keyword">
  81. ="alt">{

  82. ="keyword">for(="datatypes">i=0;i<_vec_vec[P1_i].size;i)
  83. ="alt">{
  84. _vec_vec[P2_i].push_back(_vec_vec[P1_i][i]);
  85. ="alt">}
  86. _vec_vec.erase(_vec_vec.begin+P1_i);="comment">//删除点集
  87. ="alt">}
  88. distance_KE.A[P1][P2]=E.A[P2][P1]=K[k].value;
  89. ="alt">counter;
  90. }
  91. ="alt">}
  92. }
  93. ="alt">k;
  94. }="keyword">while(counter<E.pos-1);
  95. ="alt">="keyword">;
  96. }
  97. ="alt">="comment">//为GEK申请空间化、、、
  98. ="keyword">voidInit_P_Chart(="datatypes">pos)
  99. ="alt">{
  100. ="comment">//为GEK申请空间
  101. ="alt">G.A=="keyword">="datatypes">*[pos];
  102. E.A=="keyword">="datatypes">*[pos];
  103. ="alt">G.flag=="keyword">="datatypes">bool[pos];
  104. E.flag=="keyword">="datatypes">bool[pos];
  105. ="alt">K=="keyword">K_Chart[pos*(pos-1)/2];
  106. ="alt">E.pos=G.pos=pos;
  107. ="alt">="keyword">for

    (="datatypes">i=0;i<pos;i)
  108. {
  109. ="alt">G.A[i]=="keyword">="datatypes">[pos];
  110. E.A[i]=="keyword">="datatypes">[pos];
  111. ="alt">G.flag[i]=E.flag[i]=="keyword">false;
  112. }
  113. ="alt">="comment">////为G,E,K化、、、
  114. K_i=0;
  115. ="alt">
  116. ="keyword">for(i=0;i<pos;i)
  117. ="alt">="keyword">for(="datatypes">j=i;j<pos;j)
  118. {
  119. ="alt">E.A[j][i]=E.A[i][j]=INT_MAX;
  120. ="keyword">(ij)
  121. ="alt">{
  122. G.A[j][i]=G.A[i][j]=0;
  123. ="alt">="comment">//continue;
  124. }="comment">/**/
  125. ="alt">="keyword">
  126. {
  127. ="alt">K[K_i].value=G.A[j][i]=G.A[i][j]=rand%20+1;
  128. K[K_i].po.P1=i;
  129. ="alt">K[K_i].po.P2=j;
  130. }
  131. ="alt">
  132. }
  133. ="alt">
  134. }
  135. ="alt">="comment">//释放图空间GEK
  136. ="keyword">voidDelete_Chart(="datatypes">pos)
  137. ="alt">{
  138. ="keyword">for(="datatypes">i=0;i<pos;i)
  139. ="alt">{

  140. ="keyword">deleteG.A[i];
  141. ="alt">="keyword">deleteE.A[i];
  142. }
  143. ="alt">="keyword">deleteK;
  144. ="keyword">deleteG.A;
  145. ="alt">="keyword">deleteE.A;
  146. ="alt">}
  147. ="comment">//输出图P,图K
  148. ="alt">="keyword">voidPr_P_Chart(="keyword">constP_Chart&G,="keyword">constK_Chart*K)
  149. {
  150. ="alt">cout<<="">"\n\n";
  151. ="keyword">for(="datatypes">i=0;i<G.pos;i)
  152. ="alt">{
  153. cout<<="">"";
  154. ="alt">="keyword">for(="datatypes">j=0;j<G.pos;j)
  155. {
  156. ="alt">="keyword">(G.A[i][j]INT_MAX)
  157. cout<<="">"∞"<<="">"";
  158. ="alt">="keyword">
  159. cout<<G.A[i][j]<<="">"";
  160. ="alt">}
  161. cout<<endl;
  162. ="alt">}
  163. ="comment">/*
  164. ="alt">="comment">for(i=0;i<K_i;i)
  165. ="comment">{
  166. ="alt">="comment">cout<<""<<K[i].po.P1<<"--"<<K[i].po.P2<<":"<<K[i].value<<endl;
  167. ="comment">}
  168. ="alt">="comment">*/
  169. }
  170. ="alt">

    ="keyword">void
  171. {
  172. ="alt">="datatypes">time_tt;
  173. srand((unsigned)time(&t));
  174. ="alt">
  175. ="datatypes">charc;
  176. ="alt">="keyword">do
  177. {
  178. ="alt">="comment">//清空
  179. _vec_vec.clear;
  180. ="alt">distance_P=0;
  181. distance_K=0;
  182. ="alt">="datatypes">pos;
  183. ="keyword">do
  184. ="alt">{
  185. system(="">"cls");
  186. ="alt">cout<<="">"\n\n\n请输入生成树点数(>0):";
  187. cin>>pos;
  188. ="alt">}="keyword">while(pos<=0);
  189. ="comment">//为GE申请空间化、、、
  190. ="alt">Init_P_Chart(pos);
  191. Pr_P_Chart(G,K);
  192. ="alt">Prim(G,E);="comment">//
  193. cout<<="">"\n以上生成树由Prim算法求得最小生成树为(如下):";="comment">//
  194. ="alt">Pr_P_Chart(E,K);="comment">//
  195. cout<<="">"以上最小生成树路径长度:"<<distance_P<<endl;="comment">//
  196. ="alt">Kruskal(K,E);
  197. cout<<="">"\n以上生成树由Kruskal算法求得最小生成树为(如下):";="comment">//
  198. ="alt">Pr_P_Chart(E,K);
  199. cout<<="">"以上最小生成树路径长度:"

    <<distance_K<<endl;="comment">//
  200. ="alt">Delete_Chart(pos);
  201. cout<<="">"\n\n!!!按任意键继续Esc退出!!!"<<endl;
  202. ="alt">}="keyword">while((c=getch)!=27);
  203. ="keyword">;
  204. ="alt">}
——贪婪技术在图问题中应用
1.实验题目
用 kruskal 算法和 prim算法构造任意个无向图最小生成树
2.实验目
1)掌握最小生成树概念及其基本性质;
2)掌握最优子结构性质证明思路方法;
3)掌握贪心法设计思想并能熟练运用
3.实验要求
1)证明最小生成树满足最优子结构性质;
2)实现 kruskal和 prim算法;
3)设计测试数据对上述两个算法进行效率比较
数据结构:

/*定义用于Prim算法求解最小生成树结构体:

flag 标志对应点是否加入最小生成树(点)集合



A[i][j]存放点i到点j权重

pos记录该最小生成树点数 */

typedef struct P_Chart

{

bool *flag ;

**A ;

pos ;

} P_Chart ;

//存放条边两个点

typedef struct Po

{ P1 ;

P2 ;

} Po ;

/*定义用于Kruskal算法求解最小生成树结构体:



value 记录边权重

po存放该边两个点*/

typedef struct K_Chart

{ value ;

Po po ;

} K_Chart ;

//存放点集合--向量

typedef vector<> Int_Vec ;

//存放点集集合--(向量)向量

typedef vector<Int_Vec> Int_Vec_Vec ;//











声明:


//GE K申请空间化、、、

void Init_P_Chart( pos)

//释放图空间G E K

void Delete_Chart( pos)

//输出图P ,K

void Pr_P_Chart(const P_Chart& G ,const K_Chart *K )

/*构造最小生成树Prim算法

输入:加权连通图 G

输出:E 组成 G 最小生成树集合 */



//化最小生成树顶点集合

void Prim( P_Chart& G ,P_Chart& E )

// K1[s..t]归并排序为K2[s..t]

void MSort( K_Chart *K1 ,K_Chart *K2 , s, t)

//查找点po 在哪个点集集合_vec_vec个点集

//查找成功返回该点集位置否则返回-1

Find_i( po )

void Kruskal( K_Chart *K ,P_Chart& E )

{/*构造最小生成树Kruskal算法

输入:加权连通图 K



输出:E 组成 G 最小生成树集合 */

void Kruskal( K_Chart *K ,P_Chart& E )

{/*构造最小生成树Kruskal算法

输入:加权连通图 K

输出:E 组成 G 最小生成树集合 */






// K1[s..t]归并排序为K2[s..t]

void MSort( K_Chart *K1 ,K_Chart *K2 , s, t)



//查找点po 在哪个点集集合_vec_vec个点集

//查找成功返回该点集位置否则返回-1

Find_i( po )

/*构造最小生成树Kruskal算法

输入:加权连通图 K

输出:E 组成 G 最小生成树集合 */

void Kruskal( K_Chart *K ,P_Chart& E )











Tags: 

延伸阅读

最新评论

发表评论