首页 > 其他分享 >图论(2)

图论(2)

时间:2024-01-11 14:13:32浏览次数:27  
标签:图论 int heights vector board visited nexty

目录

130

和昨天的飞地类似,都是从最边缘的位置进行dfs/bfs,然后判断哪个点没有被遍历过

class Solution {
public:
    int dir[4][2]={1,0,-1,0,0,1,0,-1};
    void dfs(vector<vector<char>>& board,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>=board.size()||nexty>=board[0].size())
            {
                continue;
            }
            if(!visited[nextx][nexty]&&board[nextx][nexty]=='O')
            {
                visited[nextx][nexty]=true;
                dfs(board,visited,nextx,nexty);
            }
        }
    }
    void solve(vector<vector<char>>& board) {
        int m=board.size();
        int n=board[0].size();
        vector<vector<bool>> visited(m,vector<bool>(n,0));
        for(int i=0;i<m;i++)
        {
            if(!visited[i][0]&&board[i][0]=='O')
            {
                visited[i][0]=true;
                dfs(board,visited,i,0);
            }
            if(!visited[i][n-1]&&board[i][n-1]=='O')
            {
                visited[i][n-1]=true;
                dfs(board,visited,i,n-1);
            }
        }
        for(int j=0;j<n;j++)
        {
            if(!visited[0][j]&&board[0][j]=='O')
            {
                visited[0][j]=true;
                dfs(board,visited,0,j);
            }
            if(!visited[m-1][j]&&board[m-1][j]=='O')
            {
                visited[m-1][j]=true;
                dfs(board,visited,m-1,j);
            }
        }
        for(int i=0;i<m;i++)
        {
            for(int j=0;j<n;j++)
            {
                if(!visited[i][j])
                {
                    board[i][j]='X';
                }
            }
        }

    }
};

417

还是从两边开始遍历,如果下一个格子的数字比当前的大,那么就说明整体是一个上升的趋势,
如果最后两个visited都有这个格子,就说明是两边都能流到岸边的地方,

class Solution {
public:
    int dir[4][2]={1,0,-1,0,0,1,0,-1};
    void bfs(vector<vector<int>>& heights,vector<vector<bool>>& visited,int x,int y)
    {
        queue<pair<int,int>> que;
        que.push({x,y});
        visited[x][y]=true;
        while(!que.empty())
        {
            auto cur=que.front();que.pop();
            for(int i=0;i<4;i++)
            {
                int nextx=cur.first+dir[i][0];
                int nexty=cur.second+dir[i][1];
                if(nextx<0||nexty<0||nextx>=heights.size()||nexty>=heights[0].size())
                {
                    continue;
                }
                if(!visited[nextx][nexty]&&heights[nextx][nexty]>=heights[cur.first][cur.second])
                {
                    visited[nextx][nexty]=true;
                    que.push({nextx,nexty});
                }
            }
        }
    }
    vector<vector<int>> pacificAtlantic(vector<vector<int>>& heights) {
        int m=heights.size();
        int n=heights[0].size();
        vector<vector<int>> result;
        vector<vector<bool>> visitedByPac (m,vector<bool>(n,0));
        vector<vector<bool>> visitedByAtl (m,vector<bool>(n,0));
        for(int i=0;i<m;i++)
        {
            if(!visitedByPac[i][0])
            {
                visitedByPac[i][0]=true;
                bfs(heights, visitedByPac, i, 0);
            }
            if(!visitedByAtl[i][n-1])
            {
                visitedByAtl[i][n-1]=true;
                bfs(heights,visitedByAtl,i,n-1);
            }
        }
        for(int j=0;j<n;j++)
        {
            if(!visitedByPac[0][j])
            {
                visitedByPac[0][j]=true;
                bfs(heights, visitedByPac, 0, j);
            }
            if(!visitedByAtl[m-1][j])
            {
                visitedByAtl[m-1][j]=true;
                bfs(heights,visitedByAtl,m-1,j);
            }
        }
        for(int i=0;i<m;i++)
        {
            for(int j=0;j<n;j++)
            {
                if(visitedByAtl[i][j]&&visitedByPac[i][j])
                {
                    result.push_back({i,j});
                }

            }
        }
        return result;

    }
};

标签:图论,int,heights,vector,board,visited,nexty
From: https://www.cnblogs.com/liviayu/p/17958468

相关文章

  • 图论
    目录深搜入门leetcode797广搜入门leetcode200深搜和广搜6951020深搜入门leetcode797因为也是二刷,推的比较快刷题之后的感悟,其实就是先把模板写上去了之后再在里面缝缝补补出题目要求都比较模板,变通一下思路就能做出来classSolution{public:vector<vector<int>>resu......
  • 【图论】最大势算法
    模板题FishingNet给定一个无向图,判断是否是弦图。\(1\leqn\leq1000\)。算法概述最大势算法(MCS),是一个用于求出无向图完美消除序列的算法。算法流程为:钦定一个集合\(S\)。每次找到任意一个与\(S\)中的点连边最多的点,加入\(S\),放在消除序列末尾。这样就可以......
  • 图论1
    A.能量树时间限制:1000ms空间限制:262144kB题目描述时间:1s空间:256M题目描述:小信有 n 个节点的有根能量树,根为 1。最开始,树上每个节点的能量都是 0。现在小信有 n 个能量球,第 i 个能量球拥有 vi​ 能量。她想把这 n 个能量球分别放置在能量树......
  • 图论
    相关定义图是一个二元组\((V,E)\),节点集合为\(V\),边集合为\(E\),其中边\((u,v)\)的顶点为\(u,v\)。其中顶点的度数为以该顶点为端点的边数。有向图:每条边存在一个方向\(u\)->\(v\),对于有向图,点\(u\)的出度为从\(u\)出发的边数,入度为到\(u\)的边数。无向图:每条......
  • 陈峻宇高级图论讲课笔记
    离线哩!竞赛图竞赛图确实抽象,性质一堆一堆的,想不明白……而且多半都和强连通分量有关系。兰道定理考虑一共有\(n\choose2\)条边,那么\(\sumout_x=\binomn2\)。兰道定理大致就是如果竞赛图强连通,那么:\[\not\existsk\in[1,n),\sum_{x=1}^kout_x=\binomk2......
  • 图论——最短路
    https://csacademy.com/app/graph_editor/https://riverhamster.gitee.io/app/graph_editor/注:时间复杂度分析中,假设\(n\lem\len^2\)最短路本质上是一种DP阶段:点状态:拆点决策:边最优子结构:最短路的任何子路径都一定是最短路无后效性:正权图中一定可以找到一种无后......
  • 图论
    1.图的基本概念例2.握手定理例3.完全图4.子图与补图5.图的同构例6.路与回路7.割集1.点割集2.边割集3.点连通度4.边连通度8.有向图的连通性例9.图的矩阵表示例10.欧拉图11.汉密尔顿图例12.树1......
  • 浅谈一类边权带指数的图论问题
    偶然看到了这道题,求的是边权为\(n^w\)次方时树上的第\(k\)小路径,觉得这类题目很有意思,就研究了一下。1.CF464ETheClassicProblem题意:给一个无向图,每条边的边权是\(2^{w_i}\),求\(s\)到\(t\)的最短路。思路:首先,我们可以把距离看成一个二进制数,那么我们需要能支持快......
  • 图论做题记录1
    图论做题记录前言:大概是记录本人打比赛或者做题碰到的图论的部分题。所有题目均已省以下宏://QwQ#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>usingnamespacestd;#definefifirst#definesesecondtypedefpair<int,int>PII;typed......
  • C++ 图论之次最小生成树
    1.前言生成树指在无向图中找一棵包含图中的所有节点的树,此树是含有图中所有顶点的无环连通子图。对所有生成树边上的权重求和,权重和最小的树为最小生成树,次小的为次最小生成树。最小生成树和次最小生成树的应用领域都较广泛。也是图论中优为重要的研究对象,求解算法也是常规必须......