leecode332.重新安排行程

 深度优先问题,可以用回溯来解决,对于出发机场,每次可以选择一个可达机场,进行深度搜索,如果找到可行方案了就返回,否则就回溯选择下一个可达机场进行深度搜索

由于题目要求只需要一种方案,所以把一般回溯问题的返回值换成了bool,以便找到结果就立刻返回不再继续搜索,还有一个要求是可行方案的选择要依据字典排序更靠前的,所以在【目的机场,出发到目的的票数】这里的容器就由效率更高的哈希map换成了普通的map

class Solution {
private:
    //出发机场,[目的机场,出发到目的的票数]
    unordered_map> targets;

    bool dfs(vector>& tickets,vector&result){
        if(result.size()==tickets.size()+1)
            return true;
        else{
            for(pair& p:targets[result.back()]){
                if(p.second>0){
                    result.push_back(p.first);
                    p.second--;
                    if(dfs(tickets,result))
                        return true;
                    p.second++;
                    result.pop_back();
                }
            }
        }
        return false;
    }
public:
    vector findItinerary(vector>& tickets) {
        vector result;
        for(vector& ticket:tickets){
            targets[ticket[0]][ticket[1]]++;
        }
        result.push_back("JFK");
        dfs(tickets,result);
        return result;
    }
};

你可能感兴趣的:(算法,深度优先)