三木社区

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 279|回复: 0
打印 上一主题 下一主题

C语言数据结构-algo7-2.c

[复制链接]

1562

主题

1564

帖子

4904

积分

博士

Rank: 8Rank: 8

积分
4904
跳转到指定楼层
楼主
发表于 2017-9-1 09:26:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. /* algo7-2.c 实现算法7.9的程序 */
  2. #include"c1.h"
  3. typedef int VRType;
  4. typedef char InfoType;
  5. #define MAX_NAME 3 /* 顶点字符串的最大长度+1 */
  6. #define MAX_INFO 20 /* 相关信息字符串的最大长度+1 */
  7. typedef char VertexType[MAX_NAME];
  8. #include"c7-1.h"
  9. #include"bo7-1.c"

  10. typedef struct
  11. { /* 记录从顶点集U到V-U的代价最小的边的辅助数组定义 */
  12.    VertexType adjvex;
  13.    VRType lowcost;
  14. }minside[MAX_VERTEX_NUM];

  15. int minimum(minside SZ,MGraph G)
  16. { /* 求closedge.lowcost的最小正值 */
  17.    int i=0,j,k,min;
  18.    while(!SZ[i].lowcost)
  19.      i++;
  20.    min=SZ[i].lowcost; /* 第一个不为0的值 */
  21.    k=i;
  22.    for(j=i+1;j<G.vexnum;j++)
  23.      if(SZ[j].lowcost>0)
  24.        if(min>SZ[j].lowcost)
  25.        {
  26.          min=SZ[j].lowcost;
  27.          k=j;
  28.        }
  29.    return k;
  30. }

  31. void MiniSpanTree_PRIM(MGraph G,VertexType u)
  32. { /* 用普里姆算法从第u个顶点出发构造网G的最小生成树T,输出T的各条边 算法7.9 */
  33.    int i,j,k;
  34.    minside closedge;
  35.    k=LocateVex(G,u);
  36.    for(j=0;j<G.vexnum;++j) /* 辅助数组初始化 */
  37.    {
  38.      if(j!=k)
  39.      {
  40.        strcpy(closedge[j].adjvex,u);
  41.        closedge[j].lowcost=G.arcs[k][j].adj;
  42.      }
  43.    }
  44.    closedge[k].lowcost=0; /* 初始,U={u} */
  45.    printf("最小代价生成树的各条边为:\n");
  46.    for(i=1;i<G.vexnum;++i)
  47.    { /* 选择其余G.vexnum-1个顶点 */
  48.      k=minimum(closedge,G); /* 求出T的下一个结点:第K顶点 */
  49.      printf("(%s-%s)\n",closedge[k].adjvex,G.vexs[k]); /* 输出生成树的边 */
  50.      closedge[k].lowcost=0; /* 第K顶点并入U集 */
  51.      for(j=0;j<G.vexnum;++j)
  52.        if(G.arcs[k][j].adj<closedge[j].lowcost)
  53.        { /* 新顶点并入U集后重新选择最小边 */
  54.          strcpy(closedge[j].adjvex,G.vexs[k]);
  55.          closedge[j].lowcost=G.arcs[k][j].adj;
  56.        }
  57.    }
  58. }

  59. void main()
  60. {
  61.    MGraph G;
  62.    CreateAN(&G);
  63.    MiniSpanTree_PRIM(G,G.vexs[0]);
  64. }
  65. 
复制代码


回复

使用道具 举报

Archiver|手机版|小黑屋|三木电子社区 ( 辽ICP备11000133号-4 )

辽公网安备 21021702000620号

GMT+8, 2025-5-11 23:54 , Processed in 0.030499 second(s), 23 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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