图论

深搜入门leetcode797

因为也是二刷,推的比较快
刷题之后的感悟,其实就是先把模板写上去了之后再在里面缝缝补补出题目要求
都比较模板,变通一下思路就能做出来

class Solution {
public:
    vector<vector<int>> result;
    vector<int> path;
    //x代表当前的节点
    void dfs(vector<vector<int>>& graph,int x)
    {
        //终止条件是遍历到最后一个节点了
        if(x==graph.size()-1)
        {
            result.push_back(path);
            return;
        }
        //访问一个节点能到达的所有目标节点
        for(int i=0;i<graph[x].size();i++)
        {
            //添加路径,下一个目标节点
            path.push_back(graph[x][i]);
            //深搜,每个里面都要dfs
            dfs(graph,graph[x][i]);
            //深搜退出需要pop节点
            path.pop_back();
        }
    }
    vector<vector<int>> allPathsSourceTarget(vector<vector<int>>& graph) {
        path.push_back(0);
        dfs(graph,0);
        return result;
    }
};

广搜入门

广搜的搜索方式就适合于解决两个点之间的最短路径问题。

因为广搜是从起点出发,以起始点为中心一圈一圈进行搜索,一旦遇到终点,记录之前走过的节点就是一条最短路。
代码模板

int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1}; // 表示四个方向
// grid 是地图,也就是一个二维数组
// visited标记访问过的节点,不要重复访问
// x,y 表示开始搜索节点的下标
void bfs(vector<vector<char>>& grid, vector<vector<bool>>& visited, int x, int y) {
    queue<pair<int, int>> que; // 定义队列
    que.push({x, y}); // 起始节点加入队列
    visited[x][y] = true; // 只要加入队列,立刻标记为访问过的节点
    while(!que.empty()) { // 开始遍历队列里的元素
        pair<int ,int> 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 >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue;  // 坐标越界了,直接跳过
            if (!visited[nextx][nexty]) { // 如果节点没被访问过
                que.push({nextx, nexty});  // 队列添加该节点为下一轮要遍历的节点
                visited[nextx][nexty] = true; // 只要加入队列立刻标记,避免重复访问
            }
        }
    }

}

leetcode200 深搜和广搜

class Solution {
public:
    int dir[4][2]={0,1,0,-1,1,0,-1,0};
    void bfs(vector<vector<char>>& grid,vector<vector<bool>>& visited,int x,int y)
    {
        queue<pair<int,int>> que;
        que.push({x,y});
        visited[x][y]=1;
        while(!que.empty())
        {
            int x=que.front().first;
            int y=que.front().second;
            que.pop();
            for(int i=0;i<4;i++)
            {
                int nextx=x+dir[i][0];
                int nexty=y+dir[i][1];
                if(nextx<0||nexty<0||nextx>=grid.size()||nexty>=grid[0].size())
                {
                    continue;
                }
                if(!visited[nextx][nexty]&&grid[nextx][nexty]=='1')
                {
                    que.push({nextx,nexty});
                    visited[nextx][nexty]=1;
                }
            }
        }
    }
    void dfs(vector<vector<char>>& grid,vector<vector<bool>>& visited,int x,int y)
    {
        //四个方向遍历
        for(int i=0;i<4;i++)
        {
            int nextx=x+dir[i][0];
            int nexty=y+dir[i][1];
            if(nextx<0||nexty<0||nextx>=grid.size()||nexty>=grid[0].size())
            {
                continue;
            }
            if(!visited[nextx][nexty]&&grid[nextx][nexty]=='1')
            {
                visited[nextx][nexty]=1;
                dfs(grid,visited,nextx,nexty);
            }
        }
    }
    int numIslands(vector<vector<char>>& grid) {
        int n=grid.size();
        int m=grid[0].size();
        vector<vector<bool>> visited(n,vector<bool>(m,0));
        int ans=0;
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                if(!visited[i][j]&&grid[i][j]=='1')
                {
                    ans++;
                    //dfs
                    //visited[i][j]=1;
                    //dfs(grid,visited,i,j);
                    //bfs
                    bfs(grid,visited,i,j);
                }
            }
        }
        return ans;

    }
};

695

class Solution {
public:
    int dir[4][2]={1,0,-1,0,0,1,0,-1};
    int bfs(vector<vector<int>>& grid,vector<vector<bool>>& visited,int x,int y)
    {
        int area=1;
        queue<pair<int,int>> que;
        que.push({x,y});
        visited[x][y]=true;
        while(!que.empty())
        {
            int curx=que.front().first;
            int cury=que.front().second;
            que.pop();
            for(int i=0;i<4;i++)
            {
                int nextx=curx+dir[i][0];
                int nexty=cury+dir[i][1];
                if(nextx<0||nexty<0||nextx>=grid.size()||nexty>=grid[0].size())
                {
                    continue;
                }
                if(!visited[nextx][nexty]&&grid[nextx][nexty]==1)
                {
                    que.push({nextx,nexty});
                    visited[nextx][nexty]=1;
                    area++;
                }
            }
        }
        return area;
    }
    int maxAreaOfIsland(vector<vector<int>>& grid) {
        int maxarea=0;
        int n=grid.size();
        int m=grid[0].size();
        vector<vector<bool>> visited(n,vector<bool>(m,0));
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                if(!visited[i][j]&&grid[i][j]==1)
                {
                    maxarea=max(maxarea,bfs(grid,visited,i,j));
                }
            }
        }
        return maxarea;
    }
};

1020

class Solution {
public:
    int dir[4][2]={0,1,0,-1,1,0,-1,0};
    void dfs(vector<vector<int>>& grid,vector<vector<bool>>& visited,int x,int y)
    {
        for(int i=0;i<4;i++)
        {
            int nextx=x+dir[i][0];
            int nexty=y+dir[i][1];
            if(nextx<0||nexty<0||nextx>=grid.size()||nexty>=grid[0].size())
            {
                continue;
            }
            if(!visited[nextx][nexty]&&grid[nextx][nexty]==1)
            {
                visited[nextx][nexty]=1;
                dfs(grid,visited,nextx,nexty);
            }
        }
    }
    int numEnclaves(vector<vector<int>>& grid) {
        int n=grid.size();
        int m=grid[0].size();
        vector<vector<bool>> visited(n,vector<bool>(m,0));
        //只需要遍历四个边
        for(int i=0;i<n;i++)
        {
            if(!visited[i][0]&&grid[i][0]==1)
            {
                visited[i][0]=1;
                dfs(grid,visited,i,0);
            }
            if(!visited[i][m-1]&&grid[i][m-1]==1)
            {
                visited[i][m-1]=1;
                dfs(grid,visited,i,m-1);
            }
        }
        for(int j=0;j<m;j++)
        {
            if(!visited[0][j]&&grid[0][j]==1)
            {
                visited[0][j]=1;
                dfs(grid,visited,0,j);
            }
            if(!visited[n-1][j]&&grid[n-1][j]==1)
            {
                visited[n-1][j]=1;
                dfs(grid,visited,n-1,j);
            }
        }
        int ans=0;
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                if(visited[i][j]==false&&grid[i][j]==1)
                {
                    ans++;
                }
            }
        }
        return ans;


    }
};
posted @ 2024-01-10 12:28  LiviaYu  阅读(30)  评论(0)    收藏  举报