Created
February 21, 2014 15:57
-
-
Save KT-Yeh/9136855 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <bits/stdc++.h> | |
using namespace std; | |
map<string, int> Map; //將每個點從字串換成編號 | |
vector<string> toPoint[10001]; // 用來存每個點能連到哪些點 | |
void BFS(string Start, string End) | |
{ | |
queue<string> Q; | |
Q.push(Start); | |
int visit[10001] = {0}; | |
visit[Map[Start]] = 1; | |
string cur; | |
bool findedEnd = 0; | |
while (!Q.empty() && !findedEnd) { // BFS演算法 | |
cur = Q.front(); | |
Q.pop(); | |
for (string &nxt : toPoint[Map[cur]]) { | |
if (visit[Map[nxt]] == 0) { | |
visit[Map[nxt]] = visit[Map[cur]] + 1; | |
if (nxt == End){ | |
findedEnd = 1; | |
break; | |
} | |
Q.push(nxt); | |
} | |
} | |
} | |
// 從終點逆向走回起點,並將過程存在ans裡 | |
int step_count = visit[Map[End]]; | |
cur = End; | |
vector<string> ans; | |
ans.push_back(End); | |
bool stop = 0; | |
while (!stop) { | |
bool finded_nxt_point = 0; | |
for (string &nxt : toPoint[Map[cur]]) { | |
if (nxt == Start) { | |
ans.push_back(Start); | |
stop = 1; | |
break; | |
} | |
if (visit[Map[nxt]] == step_count - 1) { | |
--step_count; | |
ans.push_back(nxt); | |
cur = nxt; | |
finded_nxt_point = 1; | |
break; | |
} | |
} | |
if (!finded_nxt_point) stop = 1; | |
} | |
if (visit[Map[End]] == 0) cout << "No route" << endl; | |
else { | |
for (int i = ans.size() - 1; i > 0; --i) | |
cout << ans[i] << ' ' << ans[i-1] << endl; | |
} | |
} | |
int main() | |
{ | |
// freopen("input.txt","rt",stdin); | |
ios::sync_with_stdio(false); | |
int N, blank_line = 0; | |
while (cin >> N) { | |
if (blank_line) cout << endl; | |
blank_line = 1; | |
Map.clear(); | |
for (auto &v : toPoint) v.clear(); | |
string p1, p2; | |
for (int i = 0, j = 1; i < N; ++i) { | |
cin >> p1 >> p2; | |
if (!Map[p1]) Map[p1] = j++; | |
if (!Map[p2]) Map[p2] = j++; | |
toPoint[Map[p1]].push_back(p2); | |
toPoint[Map[p2]].push_back(p1); | |
} | |
cin >> p1 >> p2; | |
//p1,p2不管是否為前面儲存的點,如果p1==p2就輸出p1 p2 | |
if (p1 == p2) cout << p1 << ' ' << p2 << endl; | |
else if (!Map[p1] || !Map[p2]) cout << "No route" << endl; | |
else BFS (p1, p2); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment