百练 兔子与樱花(floyd+打印路径)

来源:互联网 发布:个人网络循环贷款利率 编辑:程序博客网 时间:2024/05/21 20:28

兔子与樱花

  • 查看
  • 提交
  • 统计
  • 提问
总时间限制: 
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)->Yoyogikouen
Meijishinguu
tips:1这道题目的数据量比较小,直接套用floyd即可。
2.关键的打印路径部分可以使用一个step[i][j]数组代表从定点i到顶点j的最短路中经过的第一个顶点
3.没有找到判题oj各位小伙伴知道的话,留言下啊
#include<iostream>#include<cstring>#include<algorithm>#include<map>using namespace std;int n,m,k;string a[66];int step[66][66],g[66][66];map<string,int>mp;const int inf=0x3f3f3f3f;int s,e;void init(){for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){g[i][j]=(i==j?0:inf);step[i][j]=j;}} }  void floyd() { for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { for(int k=1;k<=n;k++) { if(g[j][k]>g[j][i]+g[i][k]) { g[j][k]=g[j][i]+g[i][k]; step[j][k]=step[j][i]; } }  }  } }void display(){cout<<a[s];int k=s;while(k!=e){cout<<"->("<<g[k][step[k][e]]<<")->"<<a[step[k][e]];k=step[k][e];}cout<<endl;}int main(){cin>>n;for(int i=1;i<=n;i++){cin>>a[i];mp[a[i]]=i;}init();cin>>m;for(int i=1;i<=m;i++){string s1,s2;int d;cin>>s1>>s2>>d;g[mp[s1]][mp[s2]]=g[mp[s2]][mp[s1]]=d; } floyd();cin>>k;while(k--){string s1,s2;cin>>s1>>s2;s=mp[s1];e=mp[s2];display();}return 0;}