#include<iostream>
#include<queue>
#include<map>
using namespace std;
int s0,t,n,m,last[505],d[505],cnt,d0[505],p[505],pre[505];
struct edge{
int v,w,next;
}e[80005];
void add(int u,int v,int w)
{
e[++cnt].v=v;
e[cnt].next=last[u];
e[cnt].w=w;
last[u]=cnt;
}
struct heapnode{
int u,d;
bool operator<(const heapnode & a)const{
return d>a.d;}
};
priority_queue<heapnode>q;
void dijkstra()
{
for(int i=1;i<=n;i++)
d[i]=0x3f3f3f;
d[s0]=0;
q.push((heapnode){s0,0});
while(!q.empty())
{
heapnode x=q.top();q.pop();
int u=x.u;
if(d[u]!=x.d) continue;
for(int i=last[u];i;i=e[i].next)
{
int v=e[i].v;
if(d[v]==d[u]+e[i].w&&d0[v]>d0[u]+1)
{
pre[v]=u;
d0[v]=d0[u]+1;
}
if(d[v]>d[u]+e[i].w){
d[v]=d[u]+e[i].w;
d0[v]=d0[u]+1;
pre[v]=u;
q.push((heapnode){v,d[v]});
}
}
}
}
map<string,int>tonum;
map<int,string>toname;
void dfs(int u)
{
if(u==s0)
{
cout<<toname[s0];
return;
}
dfs(pre[u]);
cout<<"->"<<toname[u];
}
int main()
{
cin>>n;
string s,ss;
for(int i=1;i<=n;i++)
{
cin>>s>>p[i];
tonum[s]=i;
toname[i]=s;
}
cin>>m;
for(int i=1,w;i<=m;i++)
{
string u,v;
cin>>u>>v>>w;
add(tonum[u],tonum[v],w+p[tonum[u]]);
add(tonum[v],tonum[u],w+p[tonum[v]]);
}
cin>>s>>ss;
s0=tonum[s];
t=tonum[ss];
dijkstra();
if(s0==t)
d[t]=p[t];
if(d[t]!=0x3f3f3f)
{
cout<<d[t]-p[s0]<<endl;
dfs(t);
}
else
cout<<"Why not go home by plane?";
return 0;
}
7-22 过年了,回家吧
最新推荐文章于 2024-08-30 21:09:25 发布