题目:
给定一个人坐过的一些飞机的起止机场,已知这个人从 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);
}
}