基于Dijsktra算法的最短路径求解

基于Dijsktra算法的最短路径求解
 

描述

 

一张地图包括n个城市,假设城市间有m条路径(有向图),每条路径的长度已知。给定地图的一个起点城市和终点城市,利用Dijsktra算法求出起点到终点之间的最短路径。

 

输入

多组数据,每组数据有m+3行。第一行为两个整数n和m,分别代表城市个数n和路径条数m。第二行有n个字符,代表每个城市的名字。第三行到第m+2行每行有两个字符a和b和一个整数d,代表从城市a到城市b有一条距离为d的路。最后一行为两个字符,代表待求最短路径的城市起点和终点。当n和m都等于0时,输入结束。

输出

每组数据输出两行。第一行为一个整数,为从起点到终点之间最短路的长度。第二行为一串字符串,代表该路径。每两个字符之间用空格隔开。

输入样例 1 

3 3
A B C
A B 1
B C 1
A C 3
A C
6 8
A B C D E F
A F 100
A E 30
A C 10
B C 5
C D 50
E D 20
E F 60
D F 10
A F
0 0

输出样例 1

2
A B C
60
A E D F
#include<iostream>
#include<string>
#include<cstring>
#define MaxInt 32767
#define MVNum 100//最大顶点数
/* 注意是有向图,用邻接矩阵
*/
int D[MVNum];//起点开始到各个点的距离
int S[MVNum];//是否访问过
int Path[MVNum];
using namespace std;
typedef struct
{
    char vexs[MVNum];
    int arcs[MVNum][MVNum];
    int vexnum, arcnum;
}AMGraph;
int Locate(AMGraph &G,char s)//返回编号
{
    for (int i = 1; i <=G.vexnum; i++)
    {
        if (G.vexs[i] == s)
            return i;
    }
}
void Creat(AMGraph &G)
{
    for (int i = 1; i <= G.vexnum; i++)
    {
        cin >> G.vexs[i];
    }
    for(int i=0;i<=G.arcnum;i++)
        for (int j = 0; j <= G.arcnum; j++)
        {
            G.arcs[i][j] = MaxInt;
        }
    for (int i = 0; i < G.arcnum; i++)
    {
        char a, b;
        int c;
        cin >> a >> b >> c;
        int h, t;
        h = Locate(G, a);
        t = Locate(G, b);
        G.arcs[h][t] = c;//有向图
    }
}
void Dijkstra(AMGraph &G,int v0) 
{
    int n = G.vexnum;
    int v;
    for (v = 1; v <= n; v++)
    {
        S[v] = 0;
        D[v] = G.arcs[v0][v];
        if (D[v] <MaxInt)
            Path[v] = v0;
        else
            Path[v] = -1;
    }
    S[v0] = 1;
    D[v0] = 0;
    for (int i = 0; i < n - 1; i++)
    {
        int min =MaxInt;
        int v=1;
        for (int w = 1; w <= n; w++)
        {
            if (S[w] != 1 && D[w] <=min)
            {
                v = w;
                min = D[w];
            }
        }
        S[v] = 1;
        for (int w = 1; w <= n; w++)
        {
            if (S[w] != 1 && (D[v] + G.arcs[v][w] < D[w]))
            {
                D[w] = D[v] + G.arcs[v][w];
                Path[w] = v;
            }
        }
    }
}
void Print(AMGraph &G,int s,int e)
{
    int r[MVNum];//记录路径的编号
    r[0] = e;
    int i = 1;
    while (Path[r[i-1]]!=-1)
    { 
       r[i] = Path[r[i - 1]];
       i++;
    }
    for (int j = i - 1; j > 0; j--)
        cout << G.vexs[r[j]] << " ";
    cout << G.vexs[r[0]] << endl;
}
int main()
{
    int n, m;
    while (cin >> n >> m)
    {
        if (n == 0 && m == 0)
            break;
        AMGraph G;
        G.vexnum = n;
        G.arcnum = m;
        Creat(G);
        char start, end;
        cin >> start >> end;
        int s, e;
        s = Locate(G, start);
        e = Locate(G, end);
        Dijkstra(G, s);
        cout <<D[e]<<endl;
        Print(G,s,e);
    }
    return 0;
}

 

posted @ 2019-11-19 23:38  Tomorrow1126  阅读(753)  评论(0编辑  收藏  举报