所有可能的路径---对何时使用bfs+状态压缩的稍微总结

Posted C_YCBX Py_YYDS

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了所有可能的路径---对何时使用bfs+状态压缩的稍微总结相关的知识,希望对你有一定的参考价值。

题目

dfs回溯

没啥可说的,究极简单+标准

class Solution {
public:
    vector<vector<int>> ans;
    vector<int> stk;

    void dfs(vector<vector<int>>& graph, int x, int n) {
        if (x == n) {
            ans.push_back(stk);
            return;
        }
        for (auto& y : graph[x]) {
            stk.push_back(y);
            dfs(graph, y, n);
            stk.pop_back();
        }
    }

    vector<vector<int>> allPathsSourceTarget(vector<vector<int>>& graph) {
        stk.push_back(0);
        dfs(graph, 0, graph.size() - 1);
        return ans;
    }
};

关于我为什么是伞兵这件事(何时使用bfs+状压)

总结就是 数组状压+bfs 只适用于图类型的最短距离。而且一般适用于多源bfs求最短路,或者是用于利用这个状压数组求出答案所在地的具体路径,而不是直接用 vector 的记录方式。

我是伞兵。。明明就很简单的的回溯思路求出所有路径。。我还以为会形成环。。还把它当多源来做了。。最重要的是我竟还以为我自己的写法很高明。。(想了贼久)强行用bfs+状态压缩写了出来。。。 > 但此方法也不是全然毫无用处—可用于有关最短路径问题中加了很多个限制条件的题目,比如限制为走完所有结点的最短路径。又比如计算图中走到某点最短距离的具体经过的路线。这种方法一般就是图的最短路径改编题。

struct node{
    int lable;
    int path;
};

class Solution {
public:
    vector<vector<int>> allPathsSourceTarget(vector<vector<int>>& graph) {
        int n = graph.size();
        const int INF = 1<<n;
        queue<node>Q;
//用memo记录下到达n结点处经过的路径的上一个结点。不仅满足了path防止回头还记录了path的解析方式
        int memo[n][INF];
        memset(memo,0xff,sizeof(memo));
        Q.push({0,1<<0});
        auto func = [&](vector<vector<int>>&res,int path){
            vector<int>t;
            t.emplace_back(n-1);
            int new_path = path;
            for(int i=memo[n-1][path],j=n-1;i!=-1;i=memo[i][new_path]){
                t.emplace_back(i);
                new_path ^=(1<<j);
                j=i;
            }
            reverse(t.begin(),t.end());
            res.emplace_back(t);
        };
   
        vector<vector<int>>res;
        while(!Q.empty()){
            auto new_node = move(Q.front());Q.pop();
            if(new_node.lable==n-1) func(res,new_node.path);
            
            for(auto&& t:graph[new_node.lable]){
                int n_path = new_node.path | 1<<t;
                
                if(memo[t][n_path]!=new_node.lable){
                    memo[t][n_path] = new_node.lable;
                    Q.push({t,n_path});
                }
            }
        }
        return res;
    }
};

以上是关于所有可能的路径---对何时使用bfs+状态压缩的稍微总结的主要内容,如果未能解决你的问题,请参考以下文章

黑白棋游戏(或是叫再破难关)——稍微用了下状态压缩的bfs

POJ 1324 [Holedox Moving] 状态压缩BFS

解药还是毒药 codevs2594 状态压缩 BFS

P2622 关灯问题II(状态压缩+BFS)

HDOJ--3681--Prison Break(BFS预处理+状态压缩DP)

LeetCode802. 找到最终的安全状态(图论三色标记法拓扑排序)/847. 访问所有节点的最短路径(特殊的bfs,状态压缩,dp)