// http://l...content-available-to-author-only...u.tw/homework/q762.htm
#include <cstdio>
// queue
int idque[26*26] = {0};
int first = 0;
int last = 0;
int qempty(){
return first == last;
}
int qget(){
if(qempty()){
return -1;
}
int i = idque[first];
first = first%(26*26) + 1;
return i;
}
int qput(int i){
idque[last] = i;
last = last%(26*26) + 1;
}
int qinit(){
first = 0;
last = 0;
}
// traceback
int traceback[26*26] = {0};
// city name -> id
int getid(char* city){
return (city[0] - 65)*26 + city[1] - 65;
}
// id -> city name
int getname(int id, char* s){
s[0] = id/26 + 65;
s[1] = id%26 + 65;
s[3] = 0;
}
int main(){
// this subject take multi data
int data = 0;
int n;
while(1){
// EOF
if(scanf(" %d", &n) == EOF)
break;
// blank line between multidata
if(data > 0)
printf("\n");
data++;
// there are bridges between cities
char bridge[26*26][26*26] = {0};
char city1[3];
char city2[3];
for(int i=0; i<n; i++){
scanf(" %s %s", city1, city2);
int id1 = getid(city1);
int id2 = getid(city2);
bridge[id1][id2] = 1;
bridge[id2][id1] = 1;
}
// get target
char target1[3];
char target2[3];
scanf(" %s %s", target1, target2);
int tid1 = getid(target1);
int tid2 = getid(target2);
// put first item into que. the map m note which id was searched.
qinit();
char m[26*26] = {0};
m[tid1] = 1;
qput(tid1);
// start BFS
char foundedflag = 0;
while(!qempty()){
int id = qget();
// target match
if(id == tid2){
foundedflag = 1;
break;
}
// search bridges
for(int i=0; i<26*26; i++){
// don't put searched item into que
if(bridge[id][i] && !m[i]){
m[i] = 1;
qput(i);
traceback[i] = id;
}
}
}
// founded match, start traceback
if(foundedflag){
int cities[26*26] = {0};
int len = 0;
int id = tid2;
while(1){
cities[len] = id;
len++;
if(tid1 == id)
break;
id = traceback[id];
}
char s1[3] = {0};
char s2[3] = {0};
for(int i=len-1; i>0; i--){
getname(cities[i], s1);
getname(cities[i-1], s2);
printf("%s %s\n", s1, s2);
}
}else{
printf("No route\n");
}
}
return 0;
}
Ly8gaHR0cDovL2wuLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLnUudHcvaG9tZXdvcmsvcTc2Mi5odG0KCiNpbmNsdWRlIDxjc3RkaW8+CgovLyBxdWV1ZQppbnQgaWRxdWVbMjYqMjZdID0gezB9OwppbnQgZmlyc3QgPSAwOwppbnQgbGFzdCA9IDA7CgppbnQgcWVtcHR5KCl7CglyZXR1cm4gZmlyc3QgPT0gbGFzdDsKfQoKaW50IHFnZXQoKXsKCWlmKHFlbXB0eSgpKXsKCQlyZXR1cm4gLTE7Cgl9CglpbnQgaSA9IGlkcXVlW2ZpcnN0XTsKCWZpcnN0ID0gZmlyc3QlKDI2KjI2KSArIDE7CglyZXR1cm4gaTsKfQoKaW50IHFwdXQoaW50IGkpewoJaWRxdWVbbGFzdF0gPSBpOwoJbGFzdCA9IGxhc3QlKDI2KjI2KSArIDE7Cn0KCmludCBxaW5pdCgpewoJZmlyc3QgPSAwOwoJbGFzdCA9IDA7Cn0KCi8vIHRyYWNlYmFjawppbnQgdHJhY2ViYWNrWzI2KjI2XSA9IHswfTsKCi8vIGNpdHkgbmFtZSAtPiBpZAppbnQgZ2V0aWQoY2hhciogY2l0eSl7CglyZXR1cm4gKGNpdHlbMF0gLSA2NSkqMjYgKyBjaXR5WzFdIC0gNjU7Cn0KCi8vIGlkIC0+IGNpdHkgbmFtZQppbnQgZ2V0bmFtZShpbnQgaWQsIGNoYXIqIHMpewoJc1swXSA9IGlkLzI2ICsgNjU7CglzWzFdID0gaWQlMjYgKyA2NTsKCXNbM10gPSAwOwp9CgppbnQgbWFpbigpewoJLy8gdGhpcyBzdWJqZWN0IHRha2UgbXVsdGkgZGF0YQoJaW50IGRhdGEgPSAwOwoJaW50IG47Cgl3aGlsZSgxKXsKCQkvLyBFT0YKCQlpZihzY2FuZigiICVkIiwgJm4pID09IEVPRikKCQkJYnJlYWs7CgkJCQoJCS8vIGJsYW5rIGxpbmUgYmV0d2VlbiBtdWx0aWRhdGEKCQlpZihkYXRhID4gMCkKCQkJcHJpbnRmKCJcbiIpOwoJCWRhdGErKzsKCQkKCQkvLyB0aGVyZSBhcmUgYnJpZGdlcyBiZXR3ZWVuIGNpdGllcwoJCWNoYXIgYnJpZGdlWzI2KjI2XVsyNioyNl0gPSB7MH07CgkJY2hhciBjaXR5MVszXTsKCQljaGFyIGNpdHkyWzNdOwkKCQlmb3IoaW50IGk9MDsgaTxuOyBpKyspewoJCQlzY2FuZigiICVzICVzIiwgY2l0eTEsIGNpdHkyKTsKCQkJaW50IGlkMSA9IGdldGlkKGNpdHkxKTsKCQkJaW50IGlkMiA9IGdldGlkKGNpdHkyKTsKCQkJYnJpZGdlW2lkMV1baWQyXSA9IDE7CgkJCWJyaWRnZVtpZDJdW2lkMV0gPSAxOwoJCX0KCQkKCQkvLyBnZXQgdGFyZ2V0CgkJY2hhciB0YXJnZXQxWzNdOwoJCWNoYXIgdGFyZ2V0MlszXTsKCQlzY2FuZigiICVzICVzIiwgdGFyZ2V0MSwgdGFyZ2V0Mik7CgkJaW50IHRpZDEgPSBnZXRpZCh0YXJnZXQxKTsKCQlpbnQgdGlkMiA9IGdldGlkKHRhcmdldDIpOwoJCQoJCS8vIHB1dCBmaXJzdCBpdGVtIGludG8gcXVlLiB0aGUgbWFwIG0gbm90ZSB3aGljaCBpZCB3YXMgc2VhcmNoZWQuCgkJcWluaXQoKTsKCQljaGFyIG1bMjYqMjZdID0gezB9OwoJCW1bdGlkMV0gPSAxOwoJCXFwdXQodGlkMSk7CgkJCgkJLy8gc3RhcnQgQkZTCgkJY2hhciBmb3VuZGVkZmxhZyA9IDA7CgkJd2hpbGUoIXFlbXB0eSgpKXsKCQkJaW50IGlkID0gcWdldCgpOwoJCQkKCQkJLy8gdGFyZ2V0IG1hdGNoCgkJCWlmKGlkID09IHRpZDIpewoJCQkJZm91bmRlZGZsYWcgPSAxOwoJCQkJYnJlYWs7CgkJCX0KCQkJCgkJCS8vIHNlYXJjaCBicmlkZ2VzCgkJCWZvcihpbnQgaT0wOyBpPDI2KjI2OyBpKyspewoJCQkJLy8gZG9uJ3QgcHV0IHNlYXJjaGVkIGl0ZW0gaW50byBxdWUKCQkJCWlmKGJyaWRnZVtpZF1baV0gJiYgIW1baV0pewoJCQkJCW1baV0gPSAxOwoJCQkJCXFwdXQoaSk7CgkJCQkJdHJhY2ViYWNrW2ldID0gaWQ7CgkJCQl9CgkJCX0KCQl9CgkJCgkJLy8gZm91bmRlZCBtYXRjaCwgc3RhcnQgdHJhY2ViYWNrCgkJaWYoZm91bmRlZGZsYWcpewoJCQlpbnQgY2l0aWVzWzI2KjI2XSA9IHswfTsKCQkJaW50IGxlbiA9IDA7CgkJCWludCBpZCA9IHRpZDI7CgkJCXdoaWxlKDEpewoJCQkJY2l0aWVzW2xlbl0gPSBpZDsKCQkJCWxlbisrOwoJCQkJaWYodGlkMSA9PSBpZCkKCQkJCQlicmVhazsKCQkJCWlkID0gdHJhY2ViYWNrW2lkXTsKCQkJfQoJCQljaGFyIHMxWzNdID0gezB9OwoJCQljaGFyIHMyWzNdID0gezB9OwoJCQlmb3IoaW50IGk9bGVuLTE7IGk+MDsgaS0tKXsKCQkJCWdldG5hbWUoY2l0aWVzW2ldLCBzMSk7CgkJCQlnZXRuYW1lKGNpdGllc1tpLTFdLCBzMik7CgkJCQlwcmludGYoIiVzICVzXG4iLCBzMSwgczIpOwoJCQl9CgkJfWVsc2V7CgkJCXByaW50ZigiTm8gcm91dGVcbiIpOwoJCX0KCX0KCXJldHVybiAwOwp9Cg==