Responsive image

问题 B: 第2关:基于Dijsktra算法的最短路径求解

问题 B: 第2关:基于Dijsktra算法的最短路径求解

时间限制: 1 Sec  内存限制: 128 MB
提交: 0  解决: 22
[提交][状态][讨论版][命题人:]

题目描述

一张地图包括n个城市,假设城市间有m条路径(有向图),每条路径的长度已知。给定地图的一个起点城市和终点城市,利用Dijsktra算法求出起点到终点之间的最短路径。
#include<iostream>
#define MAXSIZE 100
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MaxInt 32767                        //最大值
#define MVNum 100                           //最大数量
using namespace std;
int D[MVNum];           //D[i]记录从源到终端的当前最短
int Path[MVNum];        //路径[i]记录是从源到终端上vi的当前最小序列号
typedef struct
{
    char vexs[MVNum];                   //点列表
    int arcs[MVNum][MVNum];               //连接到短端口阵列
    int vexnum;                           //数字总数
    int arcnum;                        //图中GL的总数
} AMGraph;
int LocateVex(AMGraph G,char u)
{//存储在“返回”表中的标签,无论是否返回
    int i;
    for(i=0;i<G.vexnum;i++)
        if(u==G.vexs[i])
            return i;
    return ERROR;
}
char OrigialVex(AMGraph G,int u)
{//以下文件u的元素作为表存储在返回表中?
    return G.vexs[u];
}
int CreateDN(AMGraph &G,int spot,int edge)
{//使用连接LPG阵列的方法创建定向屏蔽
    G.vexnum=spot;
    G.arcnum=edge;
    int i,j,k,w;
    char v1,v2;
    for(i=0;i<G.vexnum;++i)
        cin>>G.vexs[i];       //输入
    for(i=0;i<G.vexnum;++i) 
        for(j=0;j<G.vexnum;++j)
            G.arcs[i][j]=MaxInt;
    for(k=0;k<G.arcnum;++k)                     
    {
        cin>>v1>>v2>>w;       ///输入附着到第一个面板的标签
        i=LocateVex(G, v1);
        j=LocateVex(G, v2);  //确定v1和2之间的位置
        G.arcs[i][j]=w;    
    }//for
    return OK;
}
void ShortestPath_DIJ(AMGraph G, char V)
{//用Dijkstra算法求有向网G的v0顶点到其余顶点的最短路径
/**************begin************/








    /**************end************/
}
void Find(AMGraph G,int v)
{//在路径编号组中查找程序编号
    if(Path[v]==-1)    
        return ;
    else
    {
        Find(G,Path[v]);   
        cout<<OrigialVex(G,Path[v])<<" ";   //输出点列表中标记有路径[v]的元素
    }
}
int main()
{
    char a,b;      
    int n,m;     
    while(cin>>n>>m)
    {
        if(n==0&&m==0) break;
        AMGraph G;
        CreateDN(G,n,m);          //创建定向屏蔽
        cin>>a;                 //输入
        ShortestPath_DIJ(G,a);  //如果G的接触点和它的静止点之间有一段短时间
        cin>>b;            //触点底座b
        int v=LocateVex(G,b);//返回地面表中的下一个标记,以验证测量值的数量
        cout<<D[v]<<endl;      //将它们之间的短距离输出到B
        Find(G,v);
        cout<<b<<endl;
    }
    return 0;
}

输入描述

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

输出描述

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

样例输入

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

样例输出

2
A  B C
60
A  E D F

提示


组合提交代码,你需要提交



void ShortestPath_DIJ(AMGraph G, char V)

{//用Dijkstra算法求有向网G的v0顶点到其余顶点的最短路径

/**************begin************/

















    /**************end************/

}





[提交][状态]
ACM算法攻关部