题目描述
输入格式
输出格式
分析:1.根据题目描述我们很容易想到dijkstra。
2.如果他记起或听到了单词x ,他会在 t 毫秒后记起单词 y 。我们可以转化成:从x连接一条权值为t的单向边(因为你不能通过y记起x)y。
3.那么想要从一个单词到另一个单词,也就是跑"一个单词"到"另一个单词"的dijkstra。但是把字符串当作节点很麻烦,所以,将字符串转换为数字,我们用一个 map 来实现。
代码实现
#include<bits/stdc++.h>
using namespace std;
bool flag[1009];
long long dist[1009],g[1009][1009];
int n,m,t,q,p;
string x,y,a,b;
map<string,int>mp;
struct Node{
int id;
int dist;
Node(){
}
Node(int i,int d){
id=i;
dist=d;
}
friend bool operator <(Node a,Node b){
return a.dist>b.dist;
}
};
vector<Node>vt[1009];
priority_queue<Node>pque;
void Dijkstra(int sid){
memset(flag,false,sizeof(flag));
memset(dist,0x3f,sizeof(dist));
dist[sid]=0;
pque.push(Node(sid,dist[sid]));
while(pque.size()){
Node from=pque.top();
pque.pop();
if(flag[from.id]){
continue;
}
flag[from.id]=true;
for(auto to:vt[from.id]){
if(!flag[to.id]&&dist[to.id]>dist[from.id]+to.dist){
dist[to.id]=dist[from.id]+to.dist;
pque.push(Node(to.id,dist[to.id]));
}
}
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>x>>y>>t;
if(mp[x]==0)mp[x]=++p;
if(mp[y]==0)mp[y]=++p;
vt[mp[x]].push_back(Node(mp[y],t));
}
cin>>q;
for(int i=0;i<q;i++){
cin>>a>>b;
Dijkstra(mp[a]);
if(flag[mp[b]]!=true){
cout<<"Roger\n";
}else{
cout<<dist[mp[b]]<<"\n";
}
}
return 0;
}