300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 图的应用---最短路径问题 用迪杰斯特拉算法解决 《地铁换乘问题》

图的应用---最短路径问题 用迪杰斯特拉算法解决 《地铁换乘问题》

时间:2024-05-21 10:40:40

相关推荐

图的应用---最短路径问题 用迪杰斯特拉算法解决  《地铁换乘问题》

图的应用—最短路径问题

用迪杰斯特拉算法解决 《地铁换乘问题》

代码是在我学习的过程中完成的,也许会有问题,希望大家批评指正。

题目:

描述:已知2条地铁线路,其中A为环线,B为东西向线路,线路都是双向的。经过的站点名分别如下,两条线交叉的换乘点用T1、T2表示。编写程序,任意输入两个站点名称,输出乘坐地铁最少需要经过的车站数量(含输入的起点和终点,换乘站点只计算一次)。

地铁线A(环线)经过车站:A1 A2 A3 A4 A5 A6 A7 A8 A9 T1 A10 A11 A12 A13 T2 A14 A15 A16 A17 A18

地铁线B(直线)经过车站:B1 B2 B3 B4 B5 T1 B6 B7 B8 B9 B10 T2 B11 B12 B13 B14 B15

输入:输入两个不同的站名

输出:输出最少经过的站数,含输入的起点和终点,换乘站点只计算一次

#include<stdio.h>#include<string>#include<string.h>#include<iostream>#define inf 100;using namespace std;typedef struct graph{string top[40];int arc[40][40];int numtop;int numarc;};graph g;int loca(graph g,string s){for(int i=0;i<35;i++){if(g.top[i]==s) return i;}return -1;}int main(){int i,j;//s初始化图g.top[0]="A1";g.top[1]="A2";g.top[2]="A3";g.top[3]="A4";g.top[4]="A5";g.top[5]="A6";g.top[6]="A7";g.top[7]="A8";g.top[8]="A9";g.top[9]="T1";g.top[10]="A10";g.top[11]="A11";g.top[12]="A12";g.top[13]="A13";g.top[14]="T2";g.top[15]="A14";g.top[16]="A15";g.top[17]="A16";g.top[18]="A17";g.top[19]="A18";g.top[20]="B1";g.top[21]="B2";g.top[22]="B3";g.top[23]="B4";g.top[24]="B5";g.top[25]="B6";g.top[26]="B7";g.top[27]="B8";g.top[28]="B9";g.top[29]="B10";g.top[30]="B11";g.top[31]="B12";g.top[32]="B13";g.top[33]="B14";g.top[34]="B15";////初始化邻接矩阵///////////////////////////////////////////////////////////////////////////for(i=0;i<35;i++){for(j=0;j<35;j++){if(i==j) g.arc[i][j] = 0;else if(abs(i-j)==1) g.arc[i][j] = 1;else g.arc[i][j] = inf;}}g.arc[24][25]=inf;g.arc[25][24]=inf;g.arc[29][30]=inf;g.arc[30][29]=inf;g.arc[9][24]=1;g.arc[9][25]=1;g.arc[24][9]=1;g.arc[25][9]=1;g.arc[14][29]=1;g.arc[14][30]=1;g.arc[29][14]=1;g.arc[30][14]=1;/////////输入起点终点/////////////////////////////////////////////////////////////////////////string s1,s2;cin>>s1>>s2;int qi = loca(g,s1);int zh = loca(g,s2);////////迪杰斯特拉算法/////////////////////////////////////////////////////////////////////////int visit[35];//是否在集合s标志memset(visit,0,sizeof(visit));///////////////////////////////////////int dist[35];//每一点到起点的最短距离int loc;int path[35];//路径中每个点的前一个点for(i=0;i<35;i++){dist[i]=g.arc[qi][i];}/////////////////////////////////////visit[qi]=1;//起点int flag=2;//int flag1=0;////////找到最短的点///////////////////////////////////////////////////////////////////////////for(j=1;j<35;j++)//循环34次;把所有节点都放到集合S中{int min=inf;for(i=0;i<35;i++){if((visit[i]==0)&&(dist[i]<min)){ min=dist[i];loc=i;}}if(loc==zh) break;visit[loc]=1;flag++;////////更新dist数组///////////////////////////////////////////////////////////////////////for(i=0;i<35;i++){if((visit[i]==0)&&(min+g.arc[loc][i]<dist[i])) { dist[i]=min+g.arc[loc][i];path[i]=loc; }}}cout<<flag;return 0;}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。