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

图的应用—最短路径问题
用迪杰斯特拉算法解决 《地铁换乘问题》
代码是在我学习的过程中完成的,也许会有问题,希望大家批评指正。
题目:
描述:已知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
#include
#include
#include
#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]if(loc==zh) break;
        visit[loc]=1;
        flag++;
        ////////更新dist数组///////////////////////////////////////////////////////////////////////
        for(i=0;i<35;i++)
        {
            if((visit[i]==0)&&(min+g.arc[loc][i]return 0;
}

你可能感兴趣的:(代码开源)