[C++] 最小生成树算法 →→→→→进入此内容的聊天室

来自 , 2020-05-27, 写在 C++, 查看 108 次.
URL http://www.code666.cn/view/4496bf24
  1. #include <dos.h>
  2. #include <conio.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #define INFINITY 30000    //定义一个权值的最大值
  7. #define MAX_VERTEX_NUM 20 //图的最大顶点数
  8. typedef struct
  9. {
  10.         int arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; //邻接矩阵
  11.         int vexnum,arcnum;                //图的当前顶点和边数
  12. } Graph;
  13. typedef struct
  14. {
  15.         int adjvex;  //某顶点与已构造好的部分生成树的顶点之间权值最小的顶点
  16.         int lowcost; //某顶点与已构造好的部分生成树的顶点之间的最小权值
  17. } ClosEdge[MAX_VERTEX_NUM]; //用普里姆算法求最小生成树时的辅助数组
  18. void CreateGraph ( Graph & ); //生成图的邻接矩阵
  19. void MiniSpanTree_PRIM ( Graph,int ); //用普里姆算法求最小生成树
  20. int  minimum ( ClosEdge,int ); //在普里姆算法中求下一个结点
  21. void main()
  22. {
  23.         Graph G;  //采用邻接矩阵结构的图
  24.         char j='y';
  25.         int u;
  26.         textbackground ( 3 );  //设定屏幕颜色
  27.         textcolor ( 15 );
  28.         clrscr();
  29. //------------------程序解说----------------------------
  30.         printf ( "本程序将演示构造图的最小代价生成树。\n" );
  31.         printf ( "首先输入图的顶点数和弧数.\n格式:顶点数,弧数;例如:4,4\n" );
  32.         printf ( "接着输入各条弧(弧尾,弧头)和弧的权值。\n" );
  33.         printf ( "格式:弧尾,弧头,权值;例如\n1,2,1\n1,3,2\n2,4,3\n3,4,4\n" );
  34.         printf ( "程序将会构造该图的最小代价生成树。\n" );
  35.         printf ( "并显示该最小生成树。\n1,2\n1,3\n2,4\n" );
  36. //------------------------------------------------------
  37.         while ( j!='N'&&j!='n' )
  38.         {
  39.                 printf ( "请输入图的顶点和弧数:" );
  40.                 scanf ( "%d,%d",&G.vexnum,&G.arcnum ); //输入图的顶点数和边数
  41.                 CreateGraph ( G );    //生成邻接矩阵结构的图
  42.                 printf ( "从哪一顶点开始:" );
  43.                 scanf ( "%d",&u );  //输入普里姆算法中的起始顶点
  44.                 MiniSpanTree_PRIM ( G,u ); //普里姆算法求最小生成树
  45.                 printf ( "最小代价生成树构造完毕,继续进行吗?(Y/N)" );
  46.                 scanf ( " %c",&j );
  47.         }
  48. }
  49.  
  50. void CreateGraph ( Graph &G )
  51. {//构造邻接矩阵结构的图G
  52.         int i,j;
  53.         int start,end,weight;
  54.         for ( i=1; i<=G.vexnum; i++ )
  55.                 for ( j=1; j<=G.vexnum; j++ )
  56.                         G.arcs[i][j]=INFINITY; //初始化邻接矩阵
  57.         printf ( "输入弧和其权值,格式:弧尾,弧头,权值\n" );
  58.         for ( i=1; i<=G.arcnum; i++ )
  59.         {
  60.                 scanf ( "%d,%d,%d",&start,&end,&weight ); //输入边的起点和终点及权值
  61.                 G.arcs[start][end]=weight;
  62.                 G.arcs[end][start]=weight;
  63.         }
  64. }
  65. void MiniSpanTree_PRIM ( Graph G,int u )
  66. {//从第u个顶点出发构造图G的最小生成树
  67.         ClosEdge closedge;
  68.         int i,j,k;
  69.         printf ( "最小代价生成树:\n" );
  70.         for ( j=1; j<=G.vexnum; j++ ) //辅助数组初始化
  71.                 if ( j!=u )
  72.                 {
  73.                         closedge[j].adjvex=u;
  74.                         closedge[j].lowcost=G.arcs[u][j];
  75.                 }
  76.         closedge[u].lowcost=0; //初始,U={u}
  77.         for ( i=1; i<G.vexnum; i++ ) //选择其余的G.vexnum-1个顶点
  78.         {
  79.                 k=minimum ( closedge,G.vexnum ); //求出生成树的下一个顶点
  80.                 printf ( "%d,%d\n",closedge[k].adjvex,k ); //输出生成树的边
  81.                 closedge[k].lowcost=0;   //第k顶点并入U集
  82.                 for ( j=1; j<=G.vexnum; j++ ) //新顶点并入U后,重新选择最小边
  83.                         if ( G.arcs[k][j]<closedge[j].lowcost )
  84.                         {
  85.                                 closedge[j].adjvex=k;
  86.                                 closedge[j].lowcost=G.arcs[k][j];
  87.                         }
  88.         }
  89. }
  90. int minimum ( ClosEdge cl,int vnum )
  91. {//在辅助数组cl[vnum]中选择权值最小的顶点,并返回其位置
  92.         int i;
  93.         int w,p;
  94.         w=INFINITY;
  95.         for ( i=1; i<=vnum; i++ )
  96.                 if ( cl[i].lowcost!=0&&cl[i].lowcost<w )
  97.                         {w=cl[i].lowcost; p=i;}
  98.         return p;
  99. }
  100.  

回复 "最小生成树算法"

这儿你可以回复上面这条便签

captcha