最小生成树(Prim)算法

朴灿烈づ我的快乐病毒、 2022-06-05 01:10 370阅读 0赞

算法思想:

  • 假设G=<V,E>是连通图,TE是G上最小生成树中边的集合。
  • 算法从U={u0}(u0∈V),TE={ }开始,任取一个顶点u0作为开始点。
  • 重复执行下述操作:在所有u∈U, v∈V-U的边(u,v)∈E中找一条代价最小的边(u0,v0)并入集合TE,同时v0并入U,直至U=V为止。

注意:选择最小边时,可能有多条同样权值的边可选,此时任选其一。

Prim


代码实现:

  1. public class Prim{
  2. /** * 最小生成树的PRIM算法 * @param graph 图 * @param start 开始节点 * @param n 图中节点数 */
  3. public static void PRIM(double [][] graph,int start,int n){
  4. /*用于保存集合U到V-U之间的最小边和它的值 mins[i][0]值表示到该节点i边的起始节点,值为-1表示没有到它的起始点 mins[i][1]值表示到该边的最小值 mins[i][1]=0表示该节点已将在集合U中 */
  5. double [][] mins=new double [n][2];
  6. //初始化mins
  7. for(int i=0;i<n;i++){
  8. if(i==start){
  9. mins[i][0]=-1;
  10. mins[i][1]=0;
  11. }else if( graph[start][i]!=-1){
  12. //说明存在(start,i)的边
  13. mins[i][0]=start;
  14. mins[i][1]= graph[start][i];
  15. }else{
  16. mins[i][0]=-1;
  17. mins[i][1]=Double.MAX_VALUE;
  18. }
  19. }
  20. for(int i=0;i<n-1;i++){
  21. int minV = -1;
  22. double minW=Double.MAX_VALUE;
  23. for(int j=0;j<n;j++){ //找到mins中最小值
  24. if(mins[j][1]!=0&&minW>mins[j][1]){
  25. minW=mins[j][1];
  26. minV=j;
  27. }
  28. }
  29. mins[minV][1]=0;
  30. System.out.println("Prim的第"+i+"条最小边=<"+(int)(mins[minV][0]+1)+","+(minV+1)+">,权重="+minW);
  31. for(int j=0;j<n;j++){
  32. //更新mins数组
  33. if(mins[j][1]!=0){
  34. if( graph[minV][j]!=-1&& graph[minV][j]<mins[j][1]){
  35. mins[j][0]=minV;
  36. mins[j][1]= graph[minV][j];
  37. }
  38. }
  39. }
  40. }
  41. }
  42. public static void main(String [] args){
  43. double [][] tree={
  44. {-1, 2.0, 4.2, 6.7},
  45. {
  46. 2.0 ,-1,-1, 10.0},
  47. {
  48. 4.2,-1, -1, 4.0},
  49. {
  50. 6.7,10.0,4.0,-1}
  51. };
  52. Prim.PRIM(tree, 0, 4);
  53. }
  54. }

发表评论

表情:
评论列表 (有 0 条评论,370人围观)

还没有评论,来说两句吧...

相关阅读

    相关 生成prim算法

     边赋以权值的图称为网或带权图,带权图的生成树也是带权的,生成树T各边的权值总和称为该树的权。    最小生成树(MST):权值最小的生成树。    生成树和最小生成

    相关 生成-Prim算法

    最小生成树的目的是使一个图的节点到其他各个节点的距离最短。产生的树成为最小生成树。 最小生成树算法分为普利姆(Prim)算法与克鲁斯卡尔(Kruskal)算法来解决。

    相关 prim算法--生成

    首先我们在这里先介绍一下prim算法,我记得大学数据结构先讲完最小生成树,再讲最短路径,也是考研必考问题。 prim算法在加权连通图里面寻找全局最小的生成树。是一个贪心算法。