找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2710|回复: 0
收起左侧

有关数据结构的C++程序-城市交通最短路径问题

[复制链接]
ID:544053 发表于 2019-5-21 18:31 | 显示全部楼层 |阅读模式
设计一个交通查询系统,能让游客查询从任一城市顶点到另一城市顶点之间的最短路径或最低花费或最少时间等问题。对于不同查询要求,可输入城市间的路程或所需时间或所需费用。
本程序共分三个部分:
(1)建立交通网络图的存储结构;
(2)单源最短路径;
(3)实现两个城市顶点之间的最短路径。
0.png

单片机源程序如下:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define MVNum  100
  4. #define Maxint 32767
  5. enum  boolean{FALSE,TRUE};
  6. typedef char VertexType;
  7. typedef int  Adjmatrix;
  8. typedef struct {
  9. VertexType vexs[MVNum];
  10. Adjmatrix arcs[MVNum][MVNum];
  11. }MGraph;
  12. int D1[MVNum],P1[MVNum];
  13. int D[MVNum][MVNum],P[MVNum][MVNum];
  14. //文件名CreateMGraph.c
  15. void CreateMGraph(MGraph *G,int n,int e)
  16. {//采用邻接矩阵表示法构造有向图G,n,e表示图的当前顶点数和边数
  17. int i,j,k,w;
  18. for(i=1;i<=n;i++)
  19. G->vexs[i]=(char)i;
  20. for(i=1;i<=n;i++)
  21.         for(j=1;j<=n;j++)
  22.                 G->arcs[i][j]=Maxint;//初始化邻接矩阵
  23. printf("输入%d条边的i、j及w:\n",e);
  24. for(k=1;k<=e;k++)
  25. {
  26. scanf("%d,%d,%d,",&i,&j,&w);
  27. G->arcs[i][j]=w;
  28. }
  29. printf("有向图的存储结构建立完毕\n");
  30. }

  31. //文件dijkstra.c
  32. void Dijkstra(MGraph *G ,int v1,int n)
  33. {
  34. int D2[MVNum],P2[MVNum];
  35. int v,i,w,min;
  36. enum boolean S[MVNum];
  37. for(v=1;v<=n;v++)
  38. {
  39. S[v]=FALSE;
  40. D2[v]=G->arcs[v1][v];
  41. if(D2[v]<Maxint)
  42. P2[v]=v1;
  43. else
  44. P2[v]=0;
  45. }
  46. D2[v1]=0;
  47. S[v1]=TRUE;
  48. for(i=2;i<n;i++)
  49. {
  50. min=Maxint;
  51. for(w=1;w<=n;w++)
  52. if(!S[w]&& D2[w]<min)
  53. {
  54. v=w;
  55. min=D2[w];
  56. }
  57. S[v]=TRUE;
  58. for(w=1;w<=n;w++)
  59. if(!S[w] && (D2[v]+G->arcs[v][w]<D2[w]))
  60. {
  61. D2[w]=D2[v]+G->arcs[v][w];
  62. P2[w]=v;
  63. }
  64. }
  65. printf("路径长度路径\n");
  66. for(i=1;i<=n;i++)
  67. {
  68. printf("%5d",D2[i]);
  69. printf("%5d",i);
  70. v=P2[i];
  71. while(v!=0)
  72. {
  73. printf("<-%d",v);
  74. v=P2[v];
  75. }
  76. printf("\n");
  77. }
  78. }

  79. //文件floyd.c
  80. void Floyd(MGraph *G,int n)
  81. {
  82. int i,j,k,w;
  83. for(i=1;i<=n;i++)
  84.    for(j=1;j<=n;j++)
  85.    {
  86. if(G->arcs[i][j]!=Maxint)
  87. P[i][j]=j;
  88. else
  89. P[i][j]=0;
  90. D[i][j]=G->arcs[i][j];
  91.     }
  92. for(k=1;k<=n;k++)
  93. {
  94. for(i=1;i<=n;i++)
  95. for(j=1;j<=n;j++)
  96. {
  97. if(D[i][k]+D[k][j]<D[i][j])
  98. {
  99.    D[i][j]=D[i][k]+D[k][j];
  100.    P[i][j]=P[i][k];
  101. }
  102. }
  103.   }
  104. }
  105. void main()
  106. {
  107. MGraph *G;
  108. int m,n,e,v,w,k;
  109. int xz=1;
  110. G=(MGraph *)malloc(sizeof(MGraph));
  111. printf("输入图中顶点个数和边数n,e:");
  112. scanf("%d,%d",&n,&e);
  113. CreateMGraph(G,n,e);
  114. while(xz!=0)
  115. {
  116. printf("********求城市之间的最短路径********\n");
  117. printf("====================================\n");
  118. printf("1.求一个城市到所有城市的最短路径\n");
  119. printf("2.求任意的两个城市之间的最短路径\n");
  120. printf("====================================\n");
  121. printf("请选择: 1、或 2、选择 0、退出:");
  122. scanf("%d",&xz);
  123. if(xz==2)
  124. {
  125. Floyd(G,n);
  126. printf("输入源点(或称起点)和终点:v,w:");
  127. scanf("%d,%d",&v,&w);
  128. k=P[v][w];
  129. if(k==0)
  130.    printf("顶点%d到%d无路径!\n",v,w);
  131. else
  132.   {
  133.    printf("从顶点%d到%d的最短路径是:%d!\n",v,w,v);
  134.    while(k!=w)
  135.    {
  136.    printf("->%d",k);
  137.    k=P[k][w];
  138.    }
  139.    printf("->%d",w);
  140.    printf("路径长度:%d\n",D[v][w]);
  141.    }
  142.   }
  143.   else
  144.      if(xz==1)
  145.      {
  146. printf("求单源路径,输入源点v:");
  147. ^^^^^限于篇幅余下内容下载附件^^^^^^
复制代码

全部资料51hei下载地址:
程序.rar (1.29 KB, 下载次数: 11)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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