当前位置: 首页 > news >正文

代码随想录算法训练营第五十一天|图论part2

99.岛屿数量 深搜

题目链接:99. 岛屿数量

文章讲解:代码随想录

思路:

先将岛屿数据存储到二维矩阵,遍历二维矩阵,遇到1,则统计数量+1,然后将该岛屿四个方向的岛屿都标为已访问。

记得处理边界情况

#include <iostream>
#include <vector>
using namespace std;
int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
void dfs(vector<vector<int>>graph,vector<vector<bool>>&isvisited,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<1||nextx>=graph.size()||nexty<1||nexty>=graph[0].size())continue;if(graph[nextx][nexty]==1&&!isvisited[nextx][nexty]){isvisited[nextx][nexty]=true;dfs(graph,isvisited,nextx,nexty);}}  
}int main(){int n,m,x;cin>>n>>m;vector<vector<int>>graph(n+1,vector<int>(m+1,1));vector<vector<bool>>isvisited(n+1,vector<bool>(m+1,false));for(int i=1;i<=n;i++){                  //用二维矩阵存储图for(int j=1;j<=m;j++){cin>>x;graph[i][j]=x;}}int result=0;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(!isvisited[i][j]&&graph[i][j]){isvisited[i][j]=true;result++;dfs(graph,isvisited,i,j);  //将相连的陆地标记为已访问}}}cout<<result<<endl;
}

 

99.岛屿数量 广搜

题目链接:99. 岛屿数量

文章讲解:代码随想录

 

#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
void bfs(vector<vector<int>>graph,vector<vector<bool>>&isvisited,int x,int y){queue<pair<int,int>>mq;mq.push({x,y});    //注意pair的用法while(!mq.empty()){auto current = mq.front();  // ✅ 取出当前节点!!!!!!!!!!mq.pop();int curx = current.first;int cury = current.second;for(int i=0;i<4;i++){//考虑四个方向int nextx=curx+dir[i][0];int nexty=cury+dir[i][1];if(nextx<1||nextx>=graph.size()||nexty<1||nexty>=graph[0].size())continue;if(graph[nextx][nexty]==1&&!isvisited[nextx][nexty]){isvisited[nextx][nexty]=true;mq.push({nextx,nexty});}}}}int main(){int n,m,x;cin>>n>>m;vector<vector<int>>graph(n+1,vector<int>(m+1,1));vector<vector<bool>>isvisited(n+1,vector<bool>(m+1,false));for(int i=1;i<=n;i++){                  //用二维矩阵存储图for(int j=1;j<=m;j++){cin>>x;graph[i][j]=x;}}int result=0;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(!isvisited[i][j]&&graph[i][j]){isvisited[i][j]=true;result++;bfs(graph,isvisited,i,j);  //将相连的陆地标记为已访问}}}cout<<result<<endl;
}

广度优先搜索遍历:

新建一个队列,当前节点入队,

while队列不为空,获取队首节点,处理当前节点逻辑,符合条件的入队。

100.岛屿的最大面积

题目链接:100. 岛屿的最大面积

文章讲解:代码随想录

思路:

基本解法与上题一样

找到一个岛屿 然后用广度或者深度优先搜索去遍历周围相连的岛屿,每有一个相连,面积加1

#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
//深度优先
void dfs(vector<vector<int>>graph,vector<vector<bool>>&visited,int &area,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||nextx>=graph.size()||nexty<0||nexty>graph[0].size()) continue;if(graph[nextx][nexty]==1&&!visited[nextx][nexty]){visited[nextx][nexty]=true;area++;dfs(graph,visited,area,nextx,nexty);}}
}
//广度优先
void bfs(vector<vector<int>>graph,vector<vector<bool>>&visited,int &area,int x, int y){queue<pair<int,int>>mq;    mq.push({x,y});                //当前节点入队while(!mq.empty()){auto curnode=mq.front();   //队首节点出队mq.pop();int curx=curnode.first;int cury=curnode.second;for(int i=0;i<4;i++){     //处理当前节点有联系的int nextx=curx+dir[i][0];int nexty=cury+dir[i][1];if(nextx<0||nextx>=graph.size()||nexty<0||nexty>graph[0].size()) continue;if(graph[nextx][nexty]==1&&!visited[nextx][nexty]){visited[nextx][nexty]=true;area++;mq.push({nextx,nexty});  //有联系的入队}}}
}int main(){int n,m;cin>>n>>m;vector<vector<int>>graph(n+1,vector<int>(m+1,0));for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){cin>>graph[i][j];}}vector<vector<bool>>visited(n+1,vector<bool>(m+1,false));int maxArea=0;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(graph[i][j]==1&&!visited[i][j]){int area=1;visited[i][j]=true;bfs(graph,visited,area,i,j);// dfs(graph,visited,area,i,j);maxArea=max(maxArea,area);}}}cout<<maxArea<<endl;
}

http://www.lryc.cn/news/590451.html

相关文章:

  • (新手友好)MySQL学习笔记(完):事务和锁
  • 第三章.Redis数据类型详解——string篇
  • 用 urllib 开启爬虫之门:从零掌握网页数据抓取
  • Vue3+Ts实现父子组件间传值的两种方式
  • 自动驾驶激光3D点云处理系统性阐述及Open3D库函数应用
  • 【Elsa Workflows】Elsa Workflows审批流全功能扩展
  • string类【C++】
  • 面试问题:
  • BASE64编码通俗介绍
  • Towards Low Light Enhancement with RAW Images 论文阅读
  • 北京-4年功能测试2年空窗-报培训班学测开-第五十二天
  • linux服务器stress-ng的使用
  • WAMP允许远程访问
  • 30 天自制 C++ 服务器--Day3
  • 用python实现自动化布尔盲注
  • RHCSA(软链接与硬链接)
  • 高性能架构模式——高性能缓存架构
  • sqli-labs靶场通关笔记:第23关 注释符过滤
  • 二、CV_AlexNet
  • 81、面向服务开发方法
  • 关于SaaS业务模式及其系统架构构建的详细解析
  • 横向移动(下)
  • IPD-流程设计-TE角色说明书参考模板
  • 多维傅里叶变换性质与计算
  • CSS3动画基本使用——页面一打开盒子就从左边走向右边
  • 【尝试】本地部署openai-whisper,通过 http请求识别
  • C++-linux系统编程 11.常见问题与答案
  • 创建SprngBoot项目的四种方式
  • 降本增效利器:汽车制造中EtherCAT转PROFIBUS DP网关应用探析
  • 快速开发汽车充电桩的屏幕驱动与语音提示方案