#include <iostream>
#include <stdio.h>
#include <vector>
#include <string>
#include <unordered_map>
#include <set>
#include <algorithm>
#include <sstream>
#include <queue>
using namespace std;
/*
问题:
Given a list of airline tickets represented by pairs of departure and arrival airports [from, to],
reconstruct the itinerary in order. All of the tickets belong to a man who departs from JFK.
Thus, the itinerary must begin with JFK.Note:
If there are multiple valid itineraries, you should return the itinerary that has the smallest
lexical order when read as a single string. For example, the itinerary ["JFK", "LGA"] has a smaller lexical order than ["JFK", "LGB"].
All airports are represented by three capital letters (IATA code).
You may assume all tickets form at least one valid itinerary.
Example 1:
tickets = [["MUC", "LHR"], ["JFK", "MUC"], ["SFO", "SJC"], ["LHR", "SFO"]]
Return ["JFK", "MUC", "LHR", "SFO", "SJC"].
Example 2:
tickets = [["JFK","SFO"],["JFK","ATL"],["SFO","ATL"],["ATL","JFK"],["ATL","SFO"]]
Return ["JFK","ATL","JFK","SFO","ATL","SFO"].
Another possible reconstruction is ["JFK","SFO","ATL","JFK","ATL","SFO"]. But it is larger in lexical order.分析:题目给定了多个[from,to]的二元组,现在希望能够重新构建原来的航线,
起点都是"JFK",并且希望构建的航线在字典序上是最小的
本质上就是当前的二元组中的to是下一个而元组的from。
然后不断查找。查找可以用哈希建立映射
<from ,to>,但是一个from可能对应多个to,因此建立的映射是
<from , [to1 , to2, ...]>
另外一个问题是,可能存在环,from指向to之后,to可能指向from
而且应该是递归来做,否则不能处理,
递归来做后,获得每一条最终路线
每生成一段路线,需要将一个二元组删除,在对应建立的映射中删除该映射即可。输入:
4(票数)
MUC LHR
JFK MUC
SFO SJC
LHR SFO
5
JFK SFO
JFK ATL
SFO ATL
ATL JFK
ATL SFO
3
JFK KUL
JFK NRT
NRT JFK
输出:
JFK MUC LHR SFO SJC
JFK ATL JFK SFO ATL SFO
JFK NRT JFK KUL报错:
Input:[["JFK","KUL"],["JFK","NRT"],["NRT","JFK"]]
Output:["JFK","KUL"]
Expected:["JFK","NRT","JFK","KUL"]
也就是说优先拼出较长的路线,然后在较长的路线中选择字典序较小的
这样就需要初始的时候递归处理,
然后对于多个结果比较报错:
Input:
[["EZE","AXA"],["TIA","ANU"],["ANU","JFK"],["JFK","ANU"],["ANU","EZE"],["TIA","ANU"],["AXA","TIA"],["TIA","JFK"],["ANU","TIA"],["JFK","TIA"]]
Output:
["JFK","ANU","EZE","AXA","TIA","ANU","JFK","TIA","JFK"]
Expected:
["JFK","ANU","EZE","AXA","TIA","ANU","JFK","TIA","ANU","TIA","JFK"]
存在重复的路线,我只算了一次。这是set本身自带的去重属性导致的,
如果不想去重,采用优先级队列或者multiset关键:
1
参考别人的解法:http://www.cnblogs.com/zmyvszk/p/5657056.html
题目意思理解错了,是要遍历完所有的边,不允许剩余。
java中优先级队列的poll是移除队头并返回。本题需要设定
unordered_map<string , priority<string>>的数据结构
注意递归存储的结果需要逆序2注意C++优先级队列默认大顶堆,输出最大元素,改为小顶堆用greater<int> (例如整型)
或者用仿函数自定义比较函数
priority_queue<Type , Container , Functional>
*/struct Compare
{bool operator()(string& a , string& b ){return a > b;}
};class Solution {
public:void dfs(unordered_map<string , priority_queue<string , vector<string> , Compare> >& airlineMap , string& from , vector<string>& result){//不断获取剩余遍历的地方,然后删除优先级队列中最小的元素,递归处理,保存结果while( airlineMap.find(from) != airlineMap.end() && (!airlineMap[from].empty()) ){string to = airlineMap[from].top();airlineMap[from].pop();dfs(airlineMap , to , result);}result.push_back(from);}vector<string> findItinerary(vector<pair<string, string>> tickets) {vector<string> result;if(tickets.empty()){return result;}unordered_map<string , priority_queue<string , vector<string>  ,Compare > > airlineMap;int size = tickets.size();//生成 起点到终点的映射for(int i = 0 ; i < size ; i++){pair<string , string> ticket = tickets.at(i);if(airlineMap.find(ticket.first) != airlineMap.end()){airlineMap[ticket.first].push(ticket.second);}else{priority_queue<string , vector<string>  , Compare> toPlaces;toPlaces.push(ticket.second);airlineMap[ticket.first] = toPlaces;}}//递归处理string sFrom("JFK");dfs(airlineMap , sFrom , result );//保存的结果需要逆置reverse(result.begin() , result.end());return result;}
};void print(vector<string>& result)
{if(result.empty()){cout << "no result" << endl;return;}int size = result.size();for(int i = 0 ; i < size ; i++){cout << result.at(i) << " " ;}cout << endl;
}void process()
{vector<pair<string , string> > tickets;int num;Solution solution;vector<string> result;while(cin >> num ){tickets.clear();for(int i = 0 ; i < num ; i++){pair<string , string> ticket;cin >> ticket.first >> ticket.second;tickets.push_back(ticket);}result = solution.findItinerary(tickets);print(result);}
}int main(int argc , char* argv[])
{process();getchar();return 0;
}/*
class Result
{
public:Result(){}Result(string& result , vector<string>& results){_result = result;_results = vector<string>(results.begin() ,results.end());}bool operator < (const Result& result) const {int value = strcmp(_result.c_str() , result._result.c_str());// value < 0 ,说明 str1 < str2if(value < 0 ){return true;}else{return false;}}
public:string _result;vector<string> _results;
};class Solution {
public:void dfs(unordered_map<string , set<string> >& airlineMap , string& from , vector<string>& result, vector< vector<string> >& results){//如果当前位置找不到下一个结束位置,返回结果if(airlineMap.find(from) == airlineMap.end()){results.push_back(result);return;}set<string> toPlaces= airlineMap[from];for(set<string>::iterator it = toPlaces.begin() ; it != toPlaces.end() ; it++){string to = *it;//将当前结果加入到结果集result.push_back(to);//删除当前选中的<from, to>if(1 == toPlaces.size()){airlineMap.erase(from);}else{airlineMap[from].erase(to);}dfs(airlineMap , to , result , results);//插入回溯result.pop_back();//删除回溯if(airlineMap.find(from) != airlineMap.end()){airlineMap[from].insert(to);}else{set<string> places;places.insert(to);airlineMap[from] = places; }}}vector<string> findItinerary(vector<pair<string, string>> tickets) {vector<string> result;if(tickets.empty()){return result;}unordered_map<string , set<string> > airlineMap;int size = tickets.size();//生成 起点到终点的映射for(int i = 0 ; i < size ; i++){pair<string , string> ticket = tickets.at(i);if(airlineMap.find(ticket.first) != airlineMap.end()){airlineMap[ticket.first].insert(ticket.second);}else{set<string> toPlaces;toPlaces.insert(ticket.second);airlineMap[ticket.first] = toPlaces;}}//递归处理string sFrom("JFK");vector< vector<string> > results;result.push_back(sFrom);dfs(airlineMap , sFrom , result , results);size = results.size();int maxLen = INT_MIN;vector< Result > candidateResults;for(int i = 0 ; i < size ; i++){maxLen = max(maxLen , (int)results.at(i).size());}//如果最大长度等于结果长度,说明for(int i = 0 ; i < size ; i++){if(maxLen == results.at(i).size()){stringstream stream;for(int j = 0 ; j < maxLen ; j++){stream << results.at(i).at(j);}string temp = stream.str();Result result(temp , results.at(i));candidateResults.push_back(result);}}//排序sort(candidateResults.begin() , candidateResults.end());result = candidateResults.at(0)._results;if(result.size() > 1){return result;}else{return vector<string>();}}
};
*/

leecode 解题总结:332. Reconstruct Itinerary相关推荐

  1. 【leetcode】332. Reconstruct Itinerary

    题目如下: Given a list of airline tickets represented by pairs of departure and arrival airports [from, ...

  2. leetcode 332. Reconstruct Itinerary | 332. 重新安排行程(Java)

    题目 https://leetcode.com/problems/reconstruct-itinerary/ 题解 要把 next 数组按照字典序排列,所以用了 sorted 集合.两个坑: 必须从 ...

  3. LeetCode Reconstruct Itinerary(欧拉回路)

    问题:给出一些行程,要求输出从JFK出发的所有行程,如果有多个,要求行程是字典序最小的. 思路:欧拉回路问题. 具体代码参考: https://github.com/wuli2496/OJ/tree/ ...

  4. LeetCode github集合,附CMU大神整理笔记

    Github LeetCode集合 本人所有做过的题目都写在一个java项目中,同步到github中了,算是见证自己的进步.github目前同步的题目是2020-09-17日之后写的题.之前写过的题会 ...

  5. leetcode算法练习 JavaScript实现

    leetcode 表格内容由spider.js从leetcode-cn.com爬取. 已做题目答案也从leetcode-cn.com中爬取并生成文件. 解题进度:已解决 140/637 - 简单 94 ...

  6. LeetCode All in One 题目讲解汇总(持续更新中...)

    原文地址:https://www.cnblogs.com/grandyang/p/4606334.html 终于将LeetCode的大部分题刷完了,真是漫长的第一遍啊,估计很多题都忘的差不多了,这次开 ...

  7. 继续过中等难度.0309

      .   8  String to Integer (atoi)    13.9% Medium   . 151 Reverse Words in a String      15.7% Mediu ...

  8. Depth-first Search深度优先搜索专题4

    576. Out of Boundary Paths 思路:这道题目难倒了我.最直接的思路是暴力搜索.要注意的问题1是需要仔细观察Example2,轨迹不同意思是可以从A点到B点,再从B点到A点也可以 ...

  9. leetcode刷题规划

    LeetCode精华题目列表[刷题规划系列] – TuringPlanet 目录 算法题到底在考察什么? 题目列表 Array String Linked List Queue Stack Advan ...

最新文章

  1. 音乐(文件)断点下载
  2. 程序员过关斩将--从用户输入手机验证码开始
  3. 【剑指offer-Java版】06重建二叉树
  4. select, epoll的个人总结
  5. python【蓝桥杯vip练习题库】ADV-136大数加法(高精度加法)
  6. CSS的!important属性修改权重
  7. 两个数组找相同元素_Excel 数组公式全面解析
  8. Shell(8)——for、while、until
  9. Subversion 错误信息一览表
  10. LeetCode 559. N叉树的最大深度
  11. 计算机专业怎样提升竞争力,新形势下如何提高计算机专业学生就业竞争力.doc...
  12. HTTP请求过滤器FreeBSD accf_http)
  13. yum httpd安装详解
  14. RESTful源码笔记之RESTful Framework的基本组件
  15. jJava基础篇--IO流
  16. 2019春实习-百度-计算机视觉算法研发工程师真题
  17. 虚幻4引擎开发的手游_2019虚幻4手游大作排行-虚幻引擎开发的手机游戏
  18. 安卓智能地图开发与实施:三维地图 - ArcGIS Runtime SDK for Android
  19. SEO优化基础:SEO的优势与劣势
  20. 金蝶EAS,序时簿界面ListUI数据不允许修改、删除

热门文章

  1. matlab中legend函数的用法
  2. python plt legend并排,matplotlib Legend 图例用法
  3. 基于Java汽车配件销售业绩管理系统设计实现(源码+lw+部署文档+讲解等)
  4. MD5科普(二):MD5算法详解/如何改进MD5算法?
  5. bem什么意思_BEM规范你应该了解
  6. 逻辑漏洞连环击 攻击者盯上了 Eleven Finance 这块羊毛地
  7. 湖南文旅数据中心:湖南文旅数据早知道(9月10日)
  8. 2018最新视频上传下载网站
  9. 软件项目管理总结(2)软件项目立项和策划
  10. python复利终值_Python 常用笔记