多重集合和映射:重新安排行程(欧拉图—重点学习)

题目:

给定一个人坐过的一些飞机的起止机场,已知这个人从 JFK 起飞,那么这个人是按什么顺序
飞的;如果存在多种可能性,返回字母序最小的那种。

思路及其欧拉图:

思路1:先用哈希表记录起止机场,其中键是起始机场,值是一个多重集合,表示对应的终
止机场。因为一个人可能坐过重复的线路,所以我们需要使用多重集合储存重复值。储存完成之
后,我们可以利用栈来恢复从终点到起点飞行的顺序,再将结果逆序得到从起点到终点的顺序。

化简本题题意:给定一个 n 个点 m 条边的图,要求从指定的顶点出发,经过所有的边恰好一次(可以理解为给定起点的「一笔画」问题),使得路径的字典序最小。

这种「一笔画」问题与欧拉图或者半欧拉图有着紧密的联系,下面给出定义:

通过图中所有边恰好一次且行遍所有顶点的通路称为欧拉通路。

通过图中所有边恰好一次且行遍所有顶点的回路称为欧拉回路。

具有欧拉回路的无向图称为欧拉图。

具有欧拉通路但不具有欧拉回路的无向图称为半欧拉图。

class Solution {
    Map<String,PriorityQueue<String>>map = new HashMap<String,PriorityQueue<String>>();
    List<String> itinerary = new LinkedList<String>();

    public List<String> findItinerary(List<List<String>> tickets) {
    for (List<String>ticket : tickets){
        String src = ticket.get(0), dst = ticket.get(1);
        if(!map.containsKey(src)){
            map.put(src,new PriorityQueue<String>());
        }
        map.get(src).offer(dst);
    }  
    dfs("JFK");
    Collections.reverse(itinerary);
    return itinerary;
    }
    public void dfs(String curr){
        while (map.containsKey(curr) && map.get(curr).size() > 0){
            String tmp = map.get(curr).poll();
            dfs(tmp);
        }
        itinerary.add(curr);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只程序小洋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值