北京地铁最短路径
地铁信息存储格式
23#地铁路线数
#地铁名称
1 23#1号地铁,23个站点
苹果园 0#站点名称 是否为换乘站
存储结构
typedef struct{ char station[N]; int change; } sta; typedef struct{ int weight; int L; } G; sta vertex[NUM]; G graph[NUM][NUM]; int Vsum; pair<int,int> path[NUM]; int s[NUM]; int dis[NUM]; string linename[NUM]; int coutt[NUM]; int top=-1;
寻找起始站,终点站的对应下标信息
int search(char *s){ int i; for (i=0; i<Vsum; i++) { if (!strcmp(vertex[i].station,s)) { return i; } } return -1; }
输出换乘路线
void print(int V1,int V2){ string r=""; path[V1].first=-1; int now=V2,nowL=path[V2].second,ttt; while(now!=V1&&now){ //printf("%s\n",vertex[now].station); string ttr; if(nowL!=path[now].second&&path[now].second){ r="\n<"+linename[nowL]+"> "+r; nowL=path[now].second; if(nowL)ttt=nowL; } ttr=vertex[now].station; r=ttr+" "+r; now=path[now].first; } char th[17]; string ttr; ttr=vertex[V1].station; r=ttr+" "+r; r="<"+linename[nowL]+"> "+r; cout<<r<<endl; }
使用Dijkstra求最短路径,更新路径矩阵,并用path[]数组保存路径
void dijkstra(int V1,int V2){ int i,j; s[V1]=1; for (i=0; i<Vsum; i++) { if (i==V1) { dis[i]=0; } dis[i]=graph[V1][i].weight; } while(1){ int min=MAX; int v= -1; for (j=0; j<=Vsum; j++) { if (s[j]==0&&dis[j]<min) { min=dis[j]; v=j; } } if(v==V2||v==-1){ printf("%d\n",dis[V2]); return; } s[v]=1; for (j=0; j<=Vsum; j++) { if (!s[j]&&dis[j]>min+graph[v][j].weight) { dis[j]=min+graph[v][j].weight; path[j].first=v; path[j].second=graph[v][j].L; } } } }
命令行执行代码设置参数
for(int i=0;i<arg;i++){ if(!strcmp(args[i],"-map")){ freopen(args[++i], "r", stdin); } else if(!strcmp(args[i],"-b")){ strcpy(name_start,args[++i]); strcpy(name_end,args[++i]); } else if(!strcmp(args[i],"-o")){ freopen(args[++i], "w", stdout); } }
初始化路径矩阵
for(x=0;x<LINE;x++){ scanf("%d %d",&no,&sum); last=-1; for (y=0; y<sum; y++) { scanf("%s %d",name,&is); int index=search(name); if (index==-1) { strcpy(vertex[Vsum].station, name); vertex[Vsum].change=is; if(last!=-1){ graph[last][Vsum].L=graph[Vsum][last].L=no; graph[last][Vsum].weight=graph[Vsum][last].weight=1; } last=Vsum; Vsum++; }else{ if (last!=-1) { graph[last][index].L=graph[index][last].L=no; graph[last][index].weight=graph[index][last].weight=1; } last=index; } } }
命令行运行程序,-map指定地铁线路信息文件,-b传入起点 终点名称,-o生成路线文件
总结
最终使用C++完成项目,意识到自己的编程能力还有待提高,希望后面的项目能增加自己的编程能力和软件工程的素养。