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, ]

更新于:2020年10月8日

164 次浏览

开启你的职业生涯

完成课程获得认证

开始学习
广告