兔子与樱花---每对结点的最短路径

来源:互联网 发布:安全数据库 编辑:程序博客网 时间:2024/04/28 16:18

http://dsa.openjudge.cn/graph/0713/
总时间限制: 1000ms 内存限制: 65535kB
描述
很久很久之前,森林里住着一群兔子。有一天,兔子们希望去赏樱花,但当他们到了上野公园门口却忘记了带地图。现在兔子们想求助于你来帮他们找到公园里的最短路。

输入
输入分为三个部分。
第一个部分有P+1行(P<30),第一行为一个整数P,之后的P行表示上野公园的地点。
第二个部分有Q+1行(Q<50),第一行为一个整数Q,之后的Q行每行分别为两个字符串与一个整数,表示这两点有直线的道路,并显示二者之间的矩离(单位为米)。
第三个部分有R+1行(R<20),第一行为一个整数R,之后的R行每行为两个字符串,表示需要求的路线。
输出
输出有R行,分别表示每个路线最短的走法。其中两个点之间,用->(矩离)->相隔。
样例输入

6
Ginza
Sensouji
Shinjukugyoen
Uenokouen
Yoyogikouen
Meijishinguu
6
Ginza Sensouji 80
Shinjukugyoen Sensouji 40
Ginza Uenokouen 35
Uenokouen Shinjukugyoen 85
Sensouji Meijishinguu 60
Meijishinguu Yoyogikouen 35
2
Uenokouen Yoyogikouen
Meijishinguu Meijishinguu

样例输出
Uenokouen->(35)->Ginza->(80)->Sensouji->(60)->Meijishinguu->(35)->Yoyogikouen
Meijishinguu

#include<iostream>#include<map>#include<string>using namespace std;map<string,int> sour; // 通过地名,可以找到序号map<int ,string> yuan; // 通过序号,可以找到地名int p,q,r;#define maxn 40#define infi 1000000;class dist{public:    int len;    int pre;};dist D[maxn][maxn];void output(int s,int e){    if(s==e)    {        cout<<yuan[s];        return;    }    output(s,D[s][e].pre);    cout<<"->"<<'('<<D[D[s][e].pre][e].len<<')'<<"->"<<yuan[e];}int main(){    string tem;    cin>>p;    for(int i=0;i<p;i++)    {        cin>>tem;        sour.insert(pair<string,int>(tem,i));        yuan.insert(pair<int,string>(i,tem));    }    for(int i=0;i<p;i++)    {        for(int j=0;j<p;j++)        {            if(i!=j)            {                D[i][j].len=infi;                D[i][j].pre=-1;            }            else            {                D[i][j].len=0;                D[i][j].pre=i;            }        }    }    cin>>q;    string fol1,fol2;    int len;    for(int i=0;i<q;i++)    {        cin>>fol1>>fol2>>len;        if(D[sour[fol1]][sour[fol2]].len>len)        {            D[sour[fol1]][sour[fol2]].len=len;            D[sour[fol1]][sour[fol2]].pre=sour[fol1];            D[sour[fol2]][sour[fol1]].len=len;            D[sour[fol2]][sour[fol1]].pre=sour[fol2];        }    }    int i,j,g;    for(g=0;g<p;g++)    {        for(i=0;i<p;i++)        {            for(j=0;j<p;j++)            {                if(D[i][g].len+D[g][j].len<D[i][j].len)                {                    D[i][j].len=D[i][g].len+D[g][j].len;                    D[i][j].pre=D[g][j].pre;                }            }        }    }    cin>>r;    for(int i=0;i<r;i++)    {        cin>>fol1>>fol2;        output(sour[fol1],sour[fol2]);        cout<<endl;    }    return 0;}
0 0
原创粉丝点击