兔子与樱花

总时间限制: 
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);
    }
}

 

posted @ 2017-07-09 21:04  肉松松鼠  阅读(506)  评论(0编辑  收藏  举报