兔子与樱花

来源:互联网 发布:java jersey restful 编辑:程序博客网 时间:2024/06/02 11:22

1:兔子与樱花

  • 查看
  • 提交
  • 统计
  • 提问
总时间限制: 
1000ms 
内存限制: 
65535kB
描述

很久很久之前,森林里住着一群兔子。有一天,兔子们希望去赏樱花,但当他们到了上野公园门口却忘记了带地图。现在兔子们想求助于你来帮他们找到公园里的最短路。

输入
输入分为三个部分。
第一个部分有P+1行(P<30),第一行为一个整数P,之后的P行表示上野公园的地点。
第二个部分有Q+1行(Q<50),第一行为一个整数Q,之后的Q行每行分别为两个字符串与一个整数,表示这两点有直线的道路,并显示二者之间的矩离(单位为米)。
第三个部分有R+1行(R<20),第一行为一个整数R,之后的R行每行为两个字符串,表示需要求的路线。
输出
输出有R行,分别表示每个路线最短的走法。其中两个点之间,用->(矩离)->相隔。
样例输入
6GinzaSensoujiShinjukugyoenUenokouenYoyogikouenMeijishinguu6Ginza Sensouji 80Shinjukugyoen Sensouji 40Ginza Uenokouen 35Uenokouen Shinjukugyoen 85Sensouji Meijishinguu 60Meijishinguu Yoyogikouen 352Uenokouen YoyogikouenMeijishinguu Meijishinguu
样例输出
Uenokouen->(35)->Ginza->(80)->Sensouji->(60)->Meijishinguu->(35)->YoyogikouenMeijishinguu
    #include<iostream>#include<cmath>#include<cstring>#include<algorithm>#include<iomanip>#include<queue>#include<stack>#include<vector>#include<set>#include<map>using namespace std;struct Dict{int len;int pre;}D[35][35];map<string,int>M1;map<int,string>M2;string s1,s2;void Print(int s,int e) {if(s==e) {cout<<M2[s];return;}Print(s,D[s][e].pre);cout<<"->("<<D[D[s][e].pre][e].len<<")->"<<M2[e];}int main(){int n,m,dis;cin>>n;for(int i=0;i<n;++i){cin>>s1;M1[s1]=i;M2[i]=s1;}cin>>m;for(int i=0;i<n;++i){for(int j=0;j<n;++j){if(i==j){D[i][j].len=0;D[i][j].pre=i;}else{D[i][j].len=0x7fffffff/2;D[i][j].pre=-1;}}}for(int i=0;i<m;++i){cin>>s1>>s2>>dis;if(D[M1[s1]][M1[s2]].len>dis){D[M1[s1]][M1[s2]].len=dis;D[M1[s1]][M1[s2]].pre=M1[s1];}if(D[M1[s2]][M1[s1]].len>dis){D[M1[s2]][M1[s1]].len=dis;D[M1[s2]][M1[s1]].pre=M1[s2];}}for(int t=0;t<n;++t){for(int i=0;i<n;++i){for(int j=0;j<n;++j){if(D[i][t].len+D[t][j].len<D[i][j].len){D[i][j].len=D[i][t].len+D[t][j].len;D[i][j].pre=D[t][j].pre;}}}}int t;cin>>t;while(t--){cin>>s1>>s2;Print(M1[s1],M1[s2]);cout<<endl;}return 0;}


原创粉丝点击