城市公交站点及换乘方案设计

设计要求

城市公共交通站点,站点之间的道路,及道路长度实际构成数学意义上的无向加权图。现请设计实现一个算法,求任意两站点间最短路径距离且输出该最短路径上的每个站点,然后给一个乘车换乘方案。

站点要求

数据结构设计

使用五个数组存放每条路线途径的站点

int L1[] = {1,2,3,4,6,9,8,11,14};   // 公交1路:9个站
int L2[] = {2,5,7,8,9,13,17};          // 公交2路:7个站
int L3[] = {10,9,12,15,19,22};     // 公交3路:6个站
int L4[] = {18,19,23,24,25};       // 公交4路:5个站
int L5[] = {13,16,20,21,25};       // 公交5路:5个站

设计两个二维数组,用于后面的Floyd算法。
P存放各个站点之间的最短路径,D存放各个站点之间的最短路径的权值

//P[][]存放各个站点之间的最短路径,D[][]存放各个站点之间的最短路径的权值
int P[MAXVEX][MAXVEX],D[MAXVEX][MAXVEX];

图的数据结构设计,顶点设计一个数组,用于存放此顶点途径的路线。
如果该顶点途径路线1和路线三,则再数组下标1和3上赋值1,3,不途径的赋值为零,如下图。

typedef struct
{int name;      //站点名称 int lines[6];    //途径路线
}Vertex; typedef struct
{Vertex vexs[MAXVEX];   //站点 int arc[MAXVEX][MAXVEX];   //邻接矩阵 int numVertexes, numEdges;   //顶点数和边数
}MGraph;

图的创建和初始化

创建图,把带权的邻接矩阵赋值进去,把每个顶点路径的路线也存放在顶点的lines数组中

/* 构造图 */
void CreateMGraph(MGraph *G)
{int i, j;//请输入边数和顶点数G->numEdges=52;G->numVertexes=26;for (i = 0; i < G->numVertexes; i++)/* 初始化图的顶点编号 */{G->vexs[i].name=i;}for(i=0;i<26;i++)//初始化每个站点通过路线的数组,设为零 {for(j=0;j<6;j++){G->vexs[i].lines[j]=0;}}G->vexs[1].lines[1]=1;G->vexs[2].lines[1]=1; G->vexs[2].lines[2]=2;G->vexs[3].lines[1]=1;G->vexs[4].lines[1]=1;G->vexs[5].lines[2]=2;G->vexs[6].lines[1]=1;G->vexs[7].lines[2]=2;G->vexs[8].lines[1]=1; G->vexs[8].lines[2]=2;G->vexs[9].lines[1]=1; G->vexs[9].lines[2]=2; G->vexs[9].lines[3]=3;G->vexs[10].lines[3]=3;G->vexs[11].lines[1]=1;G->vexs[12].lines[3]=3;G->vexs[13].lines[2]=2; G->vexs[13].lines[5]=5;G->vexs[14].lines[1]=1;G->vexs[15].lines[3]=3;G->vexs[16].lines[5]=5;G->vexs[17].lines[2]=2;G->vexs[18].lines[4]=4;G->vexs[19].lines[3]=3; G->vexs[19].lines[4]=4;G->vexs[20].lines[5]=5;G->vexs[21].lines[5]=5;G->vexs[22].lines[3]=3;G->vexs[23].lines[4]=4;G->vexs[24].lines[4]=4;G->vexs[25].lines[4]=4; G->vexs[25].lines[5]=5;int t[MAXVEX][MAXVEX] = {0}; //构造无向带权图的邻接矩阵 t[1][2]  =  t[2][1] = 2; t[2][3]  =  t[3][2] = 3;t[2][5]  =  t[5][2] = 7;t[3][4]  =  t[4][3] = 5; t[4][6]  =  t[6][4] = 9;t[5][7]  =  t[7][5] = 7;  t[6][9]  =  t[9][6] = 2;t[7][8]  =  t[8][7] = 4; t[8][9]  =  t[9][8] = 6;t[8][11]  =  t[11][8] = 2;  t[9][10]  =  t[10][9] = 5;t[9][12]  =  t[12][9] = 7;  t[11][14]  =  t[14][11] = 8;t[12][15]  =  t[15][12] = 8;t[13][9]  =  t[9][13] = 2;t[13][16]  =  t[16][13] = 3;t[13][17]  =  t[17][13] = 3;  t[15][19]  =  t[19][15] = 6;t[16][20]  =  t[20][16] = 7;t[18][19]  =  t[19][18] = 1;t[19][22]  =  t[22][19] = 4; t[19][23]  =  t[23][19] = 5;t[20][21]  =  t[21][20] = 1; t[21][25]  =  t[25][21] = 3;t[23][24]  =  t[24][23] = 1; t[24][25]  =  t[25][24] = for (i = 0; i < G->numVertexes; i++)//* 初始化图 {for ( j = 0; j < G->numVertexes; j++){if (i==j)G->arc[i][j]=0;elseG->arc[i][j] = G->arc[j][i] = INFINITY;     }}for (i = 0; i < G->numVertexes; i++)//* 复制邻接矩阵 {for ( j = 0; j < G->numVertexes; j++){if(t[i][j] != 0){G->arc[i][j] = t[i][j];}   }}}

Floyd算法求多源最短路径

Floyd算法又称为插点法,是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,算法讲多源最短路径存放再P数组,最短路径的权值存放在D数组

/ Floyd算法,求网图G中各顶点v到其余顶点w的最短路径P[v][w]及带权长度D[v][w]。
void Floyd(MGraph G, int P[MAXVEX][MAXVEX],int D[MAXVEX][MAXVEX])
{ int v,w,k; for(v=0; v<G.numVertexes; ++v)   /* 初始化D与P */ { for(w=0; w<G.numVertexes; ++w) {D[v][w]=G.arc[v][w];     /* D[v][w]值即为对应点间的权值 */P[v][w]=w;                 /* 初始化P */}}for(k=0; k<G.numVertexes; ++k) {for(v=0; v<G.numVertexes; ++v) { for(w=0; w<G.numVertexes; ++w) {if (D[v][w]>D[v][k]+D[k][w])/* 如果经过下标为k顶点路径比原两点间路径更短 */{D[v][w]=D[v][k]+D[k][w];/* 将当前两点间权值设为更小的一个 */P[v][w]=P[v][k];/* 路径设置为经过下标为k的顶点 */}}}}
}

规划最短路径中的换乘方案,并输出

把两站的最短路径途径站站点,以及需要乘坐的公交路线规划出来,并输出。

void Transfer(MGraph *G,int L[MAXVEX])
{int i=0,j=0,k=0;for(i=0;i<25;i++){for(j=1;j<6;j++){if(G->vexs[L[i]].lines[j] == G->vexs[L[i+1]].lines[j]){if(G->vexs[L[i]].lines[j] != 0){cout<<" 站点"<<L[k]<<" --(公交"<<G->vexs[L[i]].lines[j]<<"路)->";k++;break;}      }   }}cout<<" 站点"<<L[k];cout<<endl<<endl;
}

输出最短路径

从P数组中输出两点的最短路径和距离,以及途径的站点的情况和数量。

void Dispath(MGraph *G,int P[MAXVEX][MAXVEX],int D[MAXVEX][MAXVEX])
{int v,w,k;int i=0;int L[MAXVEX] = {0};    //存放两站之间的最短路径 cout<<" 输入出发站:站点";cin>>v;cout<<" 输入终点站:站点";cin>>w; cout<<endl<<" 站点"<<v<<" --> 站点"<<w<<" 距离:"<<D[v][w]<<"千米"; k=P[v][w];      /* 获得第一个路径顶点下标 */cout<<" 路线: "<<v;   /* 打印源点 */L[i] = v;while(k!=w)                /* 如果路径顶点下标不是终点 */{cout<<" -> "<<k;    /* 打印路径顶点 */i++; L[i] = k;k=P[k][w];            /* 获得下一个路径顶点下标 */}L[i+1]=w;cout<<" -> "<<w<<"  共 "<<i+1<<" 站"<<endl<<endl; Transfer(G,L);
}

主函数

创建图,调用Floyd算法最短路径,输出最短路径和换乘的路线

int main()
{MGraph G; CreateMGraph(&G);Floyd(G,P,D);Dispath(&G,P,D);  }

输出结果

总结

1.数据结构设计不够完美,路线的数据结构用链表可能会更好
2.功能不够丰富,没有规划最少换乘的路线,途径站点最少的路线

城市公交站点及换乘方案设计相关推荐

  1. python建模分析实操_城市公交站点设置优化模型-基于Python

    城市公交站点设置的优化分析 一.模型应用 进入21世纪以来,我国城市公共交通飞速发展,然而随着经济社会发展,城市不断升级以及人民生活品质越来越好,城市交通拥堵.出行不便等问题日益突出,严重损坏了市民日 ...

  2. 利用python爬取城市公交站点

    利用python爬取城市公交站点 页面分析 https://guiyang.8684.cn/line1 爬虫 我们利用requests请求,利用BeautifulSoup来解析,获取我们的站点数据.得 ...

  3. 【大数据】城市公交网络分析与可视化(三):获取公交站点信息并可视化站点重要程度

    博客内容简介 通过前面的探究,我们大体知道如何获取一个城市的公交数据,并绘制了公交行驶路径散点图(效果不是很理想). 其实散点图感觉更适合类似于绘制公交站点这样的信息(行驶轨迹有其他更好的绘制技巧), ...

  4. 2023年全国各城市公交线路与站点

    公交线路与站点数据是我们做城市研究时经常会用到的基础数据.那么去哪里获取该数据呢?今天,我们就给大家分享一份2023年的全国所有城市的公交站点与线路数据,数据格式为shp矢量格式.数据来源于开源公交信 ...

  5. 基于JavaWeb实现的城市公交查询系统

    项目编号:BS-XX-043 开发技术:JavaWeb(Jsp,Servlet) 数据库:mysql 开发工具:IDEA / Eclipse 应用服务器:tomcat8.5.31 本 系统实现基于Ja ...

  6. java实现找一条转乘次数最少的公交线路?,基于最优换乘次数的城市公交查询算法...

    摘要:城市公交查询系统是一个城市非常重要的基础设施,也是城市文明的一个重要标志.该文探讨城市公交查询系统中最优换乘次数的查询算法.算法以图论中邻接矩阵为基础,结合矩阵算术运算的特点和公交查询系统的要求 ...

  7. 城市地铁站点接驳公交多目标优化方法

    1 文章信息 文章题为"城市地铁站点接驳公交多目标优化方法",是一篇发表于<交通运输工程与信息学报>有关地铁-接驳公交多目标优化的文章. 2 摘要 多方式无缝衔接,尤其 ...

  8. matlab 列维 第一维行维 第二维,基于综合矩阵的城市公交网络模型的公交换乘研究及算法实现...

    1 30 总365期 2015年第23期 (8月 中 ) 交通世界 ·工程技术 基于综合矩阵的城市公交网络模型的 公交换乘研究及算法实现 谭 泽芳 (深圳市规划国土发展研究中心 ,广东 深圳 5180 ...

  9. 【OD矩阵】《城市公交IC卡·数据分析方法及应用》基于换乘点的上车点识别

    <城市公交IC卡·数据分析方法及应用> 陈学武.李海波.候贤耀著 <城市公交IC卡·数据分析方法及应用>--基于换乘点的上车点识别·笔记 换乘点 通常情况下,公交乘客总是选择步 ...

最新文章

  1. [Oracle]为何Archivelog 没有马上被删除
  2. 【转】新浪微博手机客户端刷新都是手动刷新或者下拉刷新,为什么不设计成自动刷新?...
  3. 硬盘读取不了--完美解决
  4. django:bootstrap table加载django返回的数据
  5. sql server 里面怎么支持数字使用双引号_国查:用中文编写SQL
  6. 小程序怎么打出横线效果_成都小程序开发:哪些因素会影响小程序的运营效果?...
  7. java syncr_JAVA基础—Synchronized线程同步机制
  8. spring 环境配置
  9. 修复 IE 的文本3像素偏移Bug
  10. 第十章:SpringCloud Zuul路由器和过滤器
  11. 仅用18天,英伟达新型GAN合成真假难辨高清明星脸
  12. OpenSuSE 网络配置
  13. JAVA多线程--线程的同步安全
  14. PHP网络版CRM客户管理系统
  15. 中国数字电视视频信号基本参数
  16. winform窗体界面闪烁解决办法
  17. 华为 C/C++ 编程规范(精华总结)
  18. Lattice Diamond 学习总结---“疑难杂症”杂篇
  19. IEEE 1588和IEEE 802.1AS的版本和关系
  20. 5. 列表、元组和集合

热门文章

  1. IBM微码刷新(二)在服务器上使用BoMC介质刷新微码-cuixf@DC
  2. Lp_LIBRARY 相关问题解决
  3. 力扣:17. 电话号码的字母组合
  4. Python Socket传输图片
  5. Java基础——Arrays类的排序方法
  6. 支付宝接口的在线支付(https://openhome.alipay.com/platform/appDaily.htm?tab=info)
  7. Cadence Allegro PCB设计88问解析(二) 之 Allegro中Artwork层复用(导入导出)
  8. LR(1)分析法的总控的实现(C++实现)
  9. c++ 控制台应用程序隐藏dos界面
  10. TextView Recyclerview省略号相关