样例都过了,但是全wa
#include<queue>
#include<map>
#include<string>
#include<cstdio>
#include<iostream>
#define int long long
#define MAXM 1005
#define INF 0x7fffffff
using namespace std;
int n;
struct EDGE{
int to;
int val,next;
}e[MAXM];
map<string,int>mp;
int cnt,cntn,head[MAXM];
void addedge(string u,string v,int val){
if(mp[u]==0)mp[u]=++cntn;
if(mp[v]==0)mp[v]=++cntn;
e[++cnt].to=mp[v];
e[cnt].val=val;
e[cnt].next=head[mp[u]];
head[mp[u]]=cnt;
}
struct NODE{
int pos;
int dis;
bool operator<(const NODE &x)const{
return x.dis<dis;
}
};
priority_queue<NODE>pq;
int dis[MAXM][MAXM]={},vis[MAXM][MAXM]={},viss[MAXM];
void DJ(string a){
for(int i=1;i<=n;i++){
dis[mp[a]][i]=INF;
}
dis[mp[a]][mp[a]]=0;
pq.push(NODE{mp[a],0});
while(!pq.empty()){
NODE cur=pq.top();
pq.pop();
int tmp=cur.pos;
if(vis[mp[a]][tmp]==1)continue;
vis[mp[a]][tmp]=1;
for(int i=head[tmp];i;i=e[i].next){
if(dis[mp[a]][e[i].to]>dis[mp[a]][tmp]+e[i].val){
// cout<<"yea"<<endl;
dis[mp[a]][e[i].to]=dis[mp[a]][tmp]+e[i].val;
pq.push(NODE{e[i].to,dis[mp[a]][e[i].to]});
}
}
}
}
signed main(){
int m;
cin>>n>>m;
for(int i=1;i<=m;i++){
string u,v;
int w;
cin>>u>>v>>w;
addedge(u,v,w);
}
int q;
cin>>q;
for(int i=1;i<=q;i++){
string u,v;
cin>>u>>v;
if(mp[u]==0){
cout<<"Roger\n";
continue;
}
DJ(u);
if(dis[mp[u]][mp[v]]==INF)
cout<<"Roger\n";
else
cout<<dis[mp[u]][mp[v]]<<endl;
}
return 0;
}