在 C++ 中从给定的机票列表中查找行程


假设我们有一张由出发和到达机场对表示的机票列表,例如 [from, to],我们需要按顺序找到行程。所有机票都属于一个从金奈出发的旅客。因此,行程必须以金奈开头。

因此,如果输入类似于 [["孟买", "加尔各答"], ["金奈 ", "孟买"], ["德里", "班加罗尔"], ["加尔各答", "德里"]],则输出将为 ["金奈", "孟买", "加尔各答", "德里", "班加罗尔"]。

为了解决这个问题,我们将遵循以下步骤:

  • 定义数组 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]

  • 访问“金奈”,因为这是第一个机场

  • 反转列表 ret 并返回

示例(C++)

让我们看看以下实现以获得更好的理解:

 实时演示

#include <bits/stdc++.h>
using namespace 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("Chennai");
      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 = {{"Mumbai", "Kolkata"}, {"Chennai", "Mumbai"}, {"Delhi", "Bangalore"}, {"Kolkata", "Delhi"}};
   print_vector(ob.findItinerary(v));
}

输入

{{"Mumbai", "Kolkata"}, {"Chennai", "Mumbai"}, {"Delhi", "Bangalore"}, {"Kolkata", "Delhi"}}

输出

[Chennai, Mumbai, Kolkata, Delhi, Bangalore, ]

更新于: 2020-08-25

126 次查看

启动您的 职业生涯

通过完成课程获得认证

开始
广告