C++程序:查找访问城市正确的顺序
假设我们有一份航空机票列表,用出发机场和到达机场对表示,例如[出发地,目的地],我们需要按正确的顺序重建行程。所有机票都属于一个从KLK出发的人。因此,行程必须以JFK开始。
例如,如果输入为[["MUC", "LHR"], ["KLK ", "MUC"], ["SFO", "SJC"], ["LHR", "SFO"]],则输出将为["KLK ", "MUC", "LHR", "SFO", "SJC"]。
为了解决这个问题,我们将遵循以下步骤:
定义数组ret和一个名为graph的映射。
定义一个名为visit的方法。这将以机场名称作为输入
当graph[机场]的大小不为0时
x := graph[机场]的第一个元素
从graph[机场]中删除第一个元素
调用visit(x)
将机场插入ret
现在从主方法中执行以下操作:
对于i在0到tickers数组大小的范围内
u := tickets[i, 0],v := tickets[i, 1],将v插入graph[u]
访问“KLK”,因为这是第一个机场
反转列表ret并返回
让我们看下面的实现来更好地理解:
示例
#include <bits/stdc++.h> using name space std; void print_vector(vector<auto> v){ cout < "["; for(int i = 0; i<v.size(); i++){ cout << v[i] << ", "; } cout << "]"<<endl; } class Solution { public: vector <string> ret; map < string, multiset <string> > graph; vector<string> findItinerary(vector<vector<string>>& tickets) { for(int i = 0; i < tickets.size(); i++){ string u = tickets[i][0]; string v = tickets[i][1]; graph[u].insert(v); } 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); } }; main(){ Solution ob; vector<vector<string>> v ={{"MUC","LHR"},{"KLK","MUC"},{"SFO","SJC"},{"LHR","SFO"}}; print_vector(ob.findItinerary(v)); }
输入
{{"MUC","LHR"},{"KLK","MUC"},{"SFO","SJC"},{"LHR","SFO"}}
输出
[KLK, MUC, LHR, SFO, SJC, ]
广告