Cho danh sách vé máy bay [from, to], tái tạo hành trình đúng thứ tự. Hành trình bắt đầu từ "JFK" (trong code là "KLK").
Ví dụ: [["MUC","LHR"],["KLK","MUC"],["SFO","SJC"],["LHR","SFO"]] → ["KLK","MUC","LHR","SFO","SJC"].
Giải thuật (Hierholzer - Eulerian Path)
- Xây đồ thị
: map từ sân bay đến multiset các sân bay đến (tự động sắp xếp). - DFS
:- Khi
không rỗng: lấy sân bay đầu tiên, xóa, đệ quy. - Thêm
vào kết quả.
- Khi
- Gọi
, đảo ngượcvà trả về.
Ví dụ minh họa (C++)
#include
using namespace std;
void print_vector(vector v) {
cout << "[";
for (int i = 0; i < v.size(); i++) {
cout << v[i] << ", ";
}
cout << "]" << endl;
}
class Solution {
public:
vector ret;
map> graph;
vector findItinerary(vector>& tickets) {
for (auto& t : tickets) {
graph[t[0]].insert(t[1]);
}
visit("KLK");
reverse(ret.begin(), ret.end());
return ret;
}
void visit(string airport) {
while (graph[airport].size()) {
string x = *graph[airport].begin();
graph[airport].erase(graph[airport].begin());
visit(x);
}
ret.push_back(airport);
}
};
int main() {
Solution ob;
vector> v = {{"MUC","LHR"},{"KLK","MUC"},{"SFO","SJC"},{"LHR","SFO"}};
print_vector(ob.findItinerary(v));
}
Đầu vào
{{"MUC","LHR"},{"KLK","MUC"},{"SFO","SJC"},{"LHR","SFO"}}
Đầu ra
[KLK, MUC, LHR, SFO, SJC, ]