兔子与樱花
Posted 肉松松鼠
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了兔子与樱花相关的知识,希望对你有一定的参考价值。
- 总时间限制:
- 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 <string> #include <vector> #include <cstring> #include <iostream> #include <stack> using namespace std; string buf[32]; int dis[32]; int pre[32]; int value[32]; bool visit[32]; int p,q,r; struct Edge{ int to; int cost; Edge(){} Edge(int t,int c){ to = t;cost = c; } }; vector<Edge> graph[32]; int find(string s){ for(int i = 0;i < p;i++) if(buf[i] == s)return i; } void findPath(int s,int t){ int save = t; stack<int> st; stack<int> st2; while(t != s){ st.push(pre[t]); st2.push(value[t]); t = pre[t]; } string base= "->"; while(!st.empty()){ int temp = st.top(); cout<<buf[temp]<<base<<‘(‘<<st2.top()<<‘)‘<<base; st.pop(); st2.pop(); } cout<<buf[save]<<endl; } void Dijstra(int s){ for(int i = 0;i < p;i++){ dis[i] = -1; visit[i] = false; pre[i] = -1; } dis[s] = 0; visit[s] = 1; int newP = s; for(int i = 1;i < p;i++){ int size = graph[newP].size(); for(int j = 0;j < size;j++){ int to = graph[newP][j].to; int v = graph[newP][j].cost; if(visit[to])continue; if(dis[to] == -1 || dis[newP] + v < dis[to]){ dis[to] = dis[newP] + v ; pre[to] = newP; //printf("pre[%d] %d\n",to,newP); value[to] = v; } } int min = 0x3f3f3f; for(int j = 0;j < p;j++){ if(dis[j] == -1 || visit[j])continue; if(min > dis[j]){ min = dis[j]; newP = j; } } visit[newP] = 1; //printf("newP:%d\n",newP); } } int main(){ cin>>p; for(int i = 0;i < p;i++){ cin>>buf[i]; } cin>>q; for(int i = 0;i < q;i++){ string from,to; int d,t1,t2; cin>>from>>to>>d; t1 = find(from); t2 = find(to); Edge e; e.to = t2;e.cost = d; graph[t1].push_back(e); e.to = t1; graph[t2].push_back(e); } cin>>r; for(int i = 0;i < r;i++){ string ss,tt; cin>>ss>>tt; int s,t; s = find(ss);t = find(tt); Dijstra(s); findPath(s,t); } }
以上是关于兔子与樱花的主要内容,如果未能解决你的问题,请参考以下文章