北京地铁最短路径

gethub地址

 

地铁信息存储格式

 

 

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

 

posted @ 2019-10-15 01:20  31701018王嵩  阅读(460)  评论(0编辑  收藏  举报