地铁信息存储格式

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++完成项目,意识到自己的编程能力还有待提高,希望后面的项目能增加自己的编程能力和软件工程的素养。