(未完成)332. Reconstruct Itinerary

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.

s思路:
1. 给两两连接的机场,要求得到一整条路线。仔细观察,还是图的遍历嘛,但又不同与之前看到的图的遍历,因为之前的遍历是考虑节点是否被访问,而这里则是边是否被访问。这一点一定要先搞明白。如下图,从JFK开始,有两个邻居,ATL和SFO,先访问哪个题目有规定,字典排序小的机场先访问,所以先访问ATL,由于是找路线,自然是用dfs最方便,访问了ATL,常规的做法是需要标记已经访问过,但这里只需要使用一次这条边,所以干脆直接删除这条边,就不用标记是否访问,然后到ATL继续遍历,发现也有两个邻居JFK,SFO,这里也是一样,西安访问JFK,同时把JFK这条边删除;现在到JFK后,发现JFK只有一个邻居SFO(ATL已经被删除),于是访问SFO,同时删除SFO这条链接;继续遍历SFO的邻居,发现有ATL,于是访问ATL,同时删除ATL这条边,现在到ATL发现也只有一个邻居SFO,于是继续访问SFO,同时删除链接,到SFO发现没有邻居了,意味着结束了吗?还是需要回到上一层继续遍历呢?保险起见,是需要回到上一层吧!
这里写图片描述
2.由于要字典顺序访问,所以最好对每个节点的邻居排序,所以不用vector放邻居,而用map.
3. 上面分析还是不对,debug的时候,发现前面分析的不对呀,没有反应过来,所谓图里面元素的排序,本质就是topological sort,先用dfs走一边,谁的邻居节点都遍历完谁就先放入vector,最好等所有节点都放入vector再reverse vector即可!由于不是检测是否有环,所以仍然不需要用visited来表示一个节点是否访问完全还是正在访问,

class Solution {
public:

    void dfs(unordered_map<string,set<string>>&mm,vector<string>&res,string cur){
        if(mm.count(cur)==0) return;    
        for(auto it=mm[cur].begin();it!=mm[cur].end();)
        for(auto&str:mm[cur]){
            string next=str;
            mm[cur].erase(str);
            res.push_back(next);
            dfs(mm,res,next);
        }
    }   

    vector<string> findItinerary(vector<pair<string, string>> tickets) {
        //
        unordered_map<string,set<string>> mm;
        for(auto&t:tickets){
            mm[t.first].insert(t.second);        
        }
        vector<string> res;
        dfs(mm,res,"JFK");
        return res;
    }
};
Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值