代码随想录| 图论01 ●深度优先搜索知识 ●797所有可能的路径 ●广度优先搜索知识 ●200 岛屿数量dfs ●200 岛屿数量bfs

#dfs知识

看了一下感觉和二叉树,和回溯,没啥区别。

代码随想录| 图论01 ●深度优先搜索知识 ●797所有可能的路径 ●广度优先搜索知识 ●200 岛屿数量dfs ●200 岛屿数量bfs_第1张图片

#797所有可能路径

普通回溯,很快

path.push_back(0);要提前写不要忘了。另外path不要担心不需要归零,他每次回溯call完了会退回去的

vector> res;
    vector path;
    void dfs(int node, int n,vector>& graph){
        if(node==n-1){
            res.push_back(path);
            return;
        }

        for(int &adj:graph[node]){
            path.push_back(adj);
            dfs(adj,n,graph);
            path.pop_back();
        }
    }
    vector> allPathsSourceTarget(vector>& graph) {
        int n=graph.size();
        path.push_back(0);
        dfs(0,n,graph);
        return res;
    }

#bfs知识

先来对比下dfs,对于二叉树:递归遍历是dfs(前中后序),层序迭代遍历是bfs

“bfs适合于解决两个点之间的最短路径问题。因为bfs从起点出发,以起始点为中心一圈一圈进行搜索,一旦遇到终点,记录之前走过的节点就是一条最短路。(走到最短路就不会找其他的了)

也有一些问题是广搜 和 深搜都可以解决的,例如岛屿问题,这类问题的特征就是不涉及具体的遍历方式,只要能把相邻且相同属性的节点标记上就行” 只要BFS只要搜到终点一定是一条最短路径


存放容器:

能保存我们要遍历过的元素就可以,那么用队列,栈,甚至数组都可以

if queue:保证每一圈都是一个方向去转,例如统一顺时针或者逆时针。因为队列是先进先出,加入元素和弹出元素的顺序是没有改变的。

if stack: 就是第一圈顺时针遍历,第二圈逆时针遍历,第三圈有顺时针遍历。因为栈先进后出,加入元素和弹出元素的顺序改变了。

那么广搜不需要注意转圈搜索的顺序。所以队列栈都是可以,但大家都习惯用队列了,所以下面的讲解用我也用队列来讲,只不过要给大家说清楚,并不是非要用队列,用栈也可以


#200 岛屿数量 bfs 模板题

广搜我还是不熟练,自己写的很有问题。基础模板要掌握

此题易错注意:加入队列就代表走过,就需要标记,而不是从队列拿出来的时候再去标记走过如果从队列拿出节点,再去标记这个节点走过,会导致很多节点重复加入队列

bfs思路:遍历每一个格子ij,格子not visited 而且为1就res++,然后把他的相邻都走一遍设为visited。然后继续ij遍历

易错:grid里面是char,是要和'1'比较而不是int 1

一些写法学习: 1 push pair可以 que.push({x,y}); 比 que.push(make_pair(x,y));简洁

2. int dir[4][2] = {{0, 1}, {1, 0}, {-1, 0}, {0, -1}}; 和int dir[4][2]={0,1,0,-1,1,0,-1,0}; 是一样的,后面可以这么写是因为c++优先把已有的ary填满。二维数组是ary一行行下来的

int dir[4][2]={0,1,0,-1,1,0,-1,0};
    void bfs(int x,int y,int n, int m,vector> &v,vector>& grid){
        queue> que;
        que.push({x,y});
        v[x][y]=true;
       
        while(!que.empty()){
            auto cur=que.front(); que.pop();
            int curx=cur.first;
            int cury=cur.second;
            for(int i=0;i<4;i++){
                int nextx=curx+dir[i][0];
                int nexty=cury+dir[i][1];
                if(nextx<0||nextx>=n||nexty<0||nexty>=m) continue;
                if(v[nextx][nexty]==false&&grid[nextx][nexty]=='1'){
                    que.push({nextx,nexty});
                    v[nextx][nexty]=true;
                }
            }
        }
    }

    int numIslands(vector>& grid) {
        int n=grid.size();
        int m=grid[0].size();
        vector> v(n,vector(m,false));
        int res=0;
        for(int i=0;i

#200 岛屿数量 dfs 模板题

    int dir[4][2]={0,1,0,-1,1,0,-1,0};
    void dfs(int curx,int cury,int n, int m,vector> &v,vector>& grid){
        for(int i=0;i<4;i++){
            int nextx=curx+dir[i][0];
            int nexty=cury+dir[i][1];
            if(nextx<0||nextx>=n||nexty<0||nexty>=m) continue;
            if(v[nextx][nexty]==false&&grid[nextx][nexty]=='1'){
                v[nextx][nexty]=true;
                dfs(nextx,nexty,n,m,v,grid);
            }
        }
        
    }

    int numIslands(vector>& grid) {
        int n=grid.size();
        int m=grid[0].size();
        vector> v(n,vector(m,false));
        int res=0;
        for(int i=0;i

你可能感兴趣的:(代码随想录一刷,深度优先,图论,宽度优先)