1. 程式人生 > >資料結構程式設計回顧(五)交通諮詢系統設計

資料結構程式設計回顧(五)交通諮詢系統設計

題目五:交通諮詢系統設計
設計要求:設計一個諮詢交通系統,能讓旅客諮詢從任一個
城市到另一個城市之間的最短路徑(里程)、最低費用或者
最少時間等問題。對於不同的諮詢要求,可以輸入城市間路
程、所需時間或者所需費用。
設計分3 個部分:
1、 建立交通網路圖的儲存結構;
2、 解決單源最短路徑問題;
3、 實現兩個城市之間的最短路徑問題。

使用二維陣列traffic[i][j]來儲存兩個城市i j之間的最短距離,

由於作者比較懶,所以直接用了粗暴的floyd的方法(五行程式碼那個):

根據圖中的資料建立圖:

先建立下三角,用999999表示不可直達,然後對稱到上三角,對角線置0.

void create(int traffic[7][7]){
    int i,j;
    for(i=0;i<7;i++){
        for(j=0;j<7;j++){
            traffic[i][j]=999999;
        }
    }
    traffic[0][1]=2553;
    traffic[0][2]=700;
    traffic[0][3]=704;
    traffic[1][2]=511;
    traffic[1][4]=812;
    traffic[2][3]=349;
    traffic[2][5]=1579;
    traffic[3][6]=651;
    traffic[4][5]=2368;
    traffic[5][6]=1385;
      for(i=0;i<7;i++){
        for(j=0;j<7;j++){
            if(i==j){
                traffic[i][i]=0;
            }
            if(traffic[i][j]<999999){}
            traffic[j][i]=traffic[i][j];
        }
    }


}

floyd演算法:

void floyd(int e[7][7]){
    int i,j,k;
 for(k=0;k<7;k++)
    for(i=0;i<7;i++)
        for(j=0;j<7;j++)
          if(e[i][j]>e[i][k]+e[k][j] )
                e[i][j]=e[i][k]+e[k][j];
}

然後就是完整程式碼了。

這麼快。。。單源最短路可以使用Dijkstra,更快一些,但是有點長,ccf當時有道題類似求但願最短路當時我覺得Dijkstra寫起來太麻煩了我就直接五行程式碼,然後最後這道題得了三十分,如果Dijkstra應該過的樣例多一些,畢竟兩個的時間複雜度不在一個級別的。

 

#include <iostream>
#include <limits.h>
using namespace std;

void create(int traffic[7][7]){
    int i,j;
    for(i=0;i<7;i++){
        for(j=0;j<7;j++){
            traffic[i][j]=999999;
        }
    }
    traffic[0][1]=2553;
    traffic[0][2]=700;
    traffic[0][3]=704;
    traffic[1][2]=511;
    traffic[1][4]=812;
    traffic[2][3]=349;
    traffic[2][5]=1579;
    traffic[3][6]=651;
    traffic[4][5]=2368;
    traffic[5][6]=1385;
      for(i=0;i<7;i++){
        for(j=0;j<7;j++){
            if(i==j){
                traffic[i][i]=0;
            }
            if(traffic[i][j]<999999){}
            traffic[j][i]=traffic[i][j];
        }
    }


}
void floyd(int e[7][7]){
    int i,j,k;
 for(k=0;k<7;k++)
    for(i=0;i<7;i++)
        for(j=0;j<7;j++)
          if(e[i][j]>e[i][k]+e[k][j] )
                e[i][j]=e[i][k]+e[k][j];
}
void print(int p[7][7]){
int i,j;
  for(i=0;i<7;i++){
        for(j=0;j<7;j++){
            cout<<p[i][j]<<' ';
        }
        cout<<endl;
    }
}
void zuiduanlu(int z[7][7]){

int a,b;
while(1){
        cout<<"0:北京 1:西安 2:鄭州 3:徐州 4:成都 5:廣州 6:上海"<<endl;
cout<<"請分別輸入想要查詢的兩個城市的編號:"<<endl;
    cin>>a>>b;
    if(a>=0&&b>=0&&a<7&&b<7)
    cout<<z[a][b]<<endl;
    else
     {
         cout<<"輸入錯誤."<<endl;
         break;
     }
}
}
void danyuan(int d[7][7]){
    int a;
cout<<"0:北京 1:西安 2:鄭州 3:徐州 4:成都 5:廣州 6:上海"<<endl;
cout<<"請輸入想要查詢的城市的編號:"<<endl;
    cin>>a;
    if(a>=0&&a<7){
            int i;
        for(i=0;i<7;i++){
            cout<<a<<" to "<<i<<" is "<<d[a][i]<<endl;
        }
    }
    else
        cout<<"輸入錯誤";
}
int main()
{
    int t[7][7];
    create(t);
    floyd(t);
    //print(t);
    zuiduanlu(t);
    danyuan(t);
    return 0;
}