算法:深度优先搜索(一)
一、在图上寻找路径和遍历
在图上如何寻找从1到8的路径?
不连通的图,无法从节点1走到节点8
从起点出发,走过的点要标记,发现有没有走过的点,就随意挑选一个往前走,走不了就回退,此种路径搜索策略就称为“深度优先搜索”,简称“深搜”。
int main()
{
将所有点都标记为新点;
起点=1;
终点=8;
cout<<Dfs(起点);
}
判断从V出发能否走到终点:
bool Dfs(V)
{
if(V为终点) return true;
if(V为旧点) return false;
将V标记为旧点;
对和V相邻的每一个节点U
{
if(Dfs(U)==true)
return true;
}
return false;
}
遍历图上所有节点
Dfs(V)
{
if(V是旧点) return;
将V标记为旧点;
对和V相邻的每个点U
{ Dfs(U);}
}
int main()
{
将所有点都标记为新点;
while(在图中能找到新点k) Dfs(k);
}
二、图的表示方法——邻接表
邻接表:
用一个二维数组G存放图,G[i][j]表示节点i和节点j之间边的情况(如有无边、边方向,权值大小等)。
邻接表之间边的个数是边总数的二倍
三、城堡问题
一个城堡地形图,编写一个程序,计算城堡一共有多少个房间,最大的房间有多大。城堡被分割成m✖n(m<=50,n<=50)块,每个方块可以有0~4面墙
输入:
·程序从标准输入设备读入数据
·第一行是两个整数,分别是南北向、东西向的方块数。
·在接下来的输入行里,每个方块用一个数字(0<=p<=50)描述。用一个数字表示方块周围的墙,1表示西墙,2表示北墙,4表示东墙,8表示南墙。每个方块用代表其周围墙的数字之和表示。城墙的内墙被计算两次,方块(1,1)的南墙同时也是方块(2,1)的北墙。
·输入的数据保证城堡至少有两个房间。
输出:
·城堡的房间数、城堡中最大房间所包括的方块数。
·结果显示在标准输出设备上。
样例输入:
4
7
11 6 11 6 3 10 6
7 9 6 13 5 15 5
1 10 12 7 13 7 5
13 11 10 8 10 12 13
样例输出:
5
9
解题思路:
将方块看作是节点,相邻两个方块之间如果没有墙,则在方块之间连一条边,这样城堡就能转换成一个图。求房间个数,实际上就是在求图中有多少个极大连通子图。一个连通子图,往里头加任何一个图里的其它点,就会变得不连通,那么这个连通子图就是极大连通子图。
#include <iostream>
#include <stack>
#include <Cstring>
using namespace std;
int R,C;
int rooms[60][60];
int color[60][60];
int maxRoomArea=0,roomNum=0;
int roomArea;
void Dfs(int i,int k)
{if(color[i][k]) return;++roomArea;color[i][k]=roomNum;if((rooms[i][k]&1)==0) Dfs(i,k-1);if((rooms[i][k]&2)==0) Dfs(i-1,k);if((rooms[i][k]&4)==0) Dfs(i,k+1);if((rooms[i][k]&8)==0) Dfs(i+1,k);
}
int main()
{cin>>R>>C;for(int i=1;i<=R;++i)for(int k=1;k<=C;++k)cin>>rooms[i][k];memset(color,0,sizeof(color));for(int i=1;i<=R;++i)for(int k=1;k<=C;==k){if(!color[i][k]) {++roomNum;roomArea=0;Dfs(i,k);maxRoomArea=max(roomArea,maxRoomArea);}}cout<<roomNum<<endl;cout<<maxRoomArea<<endl;
}
算法:深度优先搜索(一)相关推荐
- (算法)深度优先搜索
深度优先搜索 概述 [一条路走到底,不撞南墙不回头] [撞南墙]有两种情况:①遇到了边界条件,②遇到了已经走过的路 深度优先的另一种结束条件,就是找到了目标出口 深度优先遍历的本质就是穷举 常见的深度 ...
- 啊哈 , 算法 !--深度优先搜索( C语言版 )
深度优先搜索 : 理解的关键在于解决"当下该如何做".至于"下一步该如何做"则与"当下该如何做"是一样的 问题 : 求出123的全排列 12 ...
- 基础算法·深度优先搜索
祝食用愉快XD 题目链接 (是一道胡乱出的题) U56815 来走迷宫鸭! 解题思路 深度优先搜索,如果能不碰墙地到达右下角的出口,就把旗子立起来表示找到了出口. 什么?你没听过深度优先搜索 没事,且 ...
- 【图论算法】深度优先搜索的应用
文章目录 深度优先搜索 无向图 双连通性 双连通以及割点的概念 找出图中割点的算法 一个例子 欧拉回路 认识欧拉回路 找出欧拉回路的算法 一个例子 有向图 查找强分支 dfs简单应用--部分和问题 深 ...
- ★深度优先搜索+解空间树+递归,三合一详解
为什么这三个内容要放在一起讲? 如果单独分开讲那么 递归 和 深度优先搜索 这两个内容就会变得及其抽象,不适合新手入门 首先明确这三个内容的定义,由于深搜和递归过于抽象先说解空间树. 一.什么是解空间 ...
- DFS(深度优先搜索)详解(概念讲解,图片辅助,例题解释,剪枝技巧)
目录 那年深夏 引入 1.什么是深度优先搜索(DFS)? 2.什么是栈? 3.什么是递归? 图解过程 问题示例 1.全排列问题 2.迷宫问题 3.棋盘问题(N皇后) 4.加法分解 模板 剪枝 1.简介 ...
- 深度优先搜索_0基础学算法 搜索篇第一讲 深度优先搜索
0基础学算法 搜索篇第一讲 深度优先搜索 相信绝大多数人对于深度优先搜索和广度优先搜索是不会特别陌生的,如果我这样说似乎你没听说过,那如果我说dfs和bfs呢?先不说是否学习过它们,至少它们的大名应该 ...
- 打印数组算法:堆栈与深度优先搜索(迷宫问题)
每日一贴,今天的内容关键字为打印数组 栈堆的拜访规矩被制约为Push和Pop两种作操,Push(入栈或压栈)向栈顶添加元素,Pop(出栈或弹出)则掏出前当栈顶的元素,也就是说,只能拜访栈顶元素而不能拜 ...
- Java实现算法导论中图的广度优先搜索(BFS)和深度优先搜索(DFS)
对算法导论中图的广度优先搜索(BFS)和深度优先搜索(DFS)用Java实现其中的伪代码算法,案例也采用算法导论中的图. import java.util.ArrayList; import java ...
- 【数据结构与算法】2.深度优先搜索DFS、广度优先搜索BFS
原文链接:https://blog.csdn.net/qq_41681241/article/details/81432634 总结 一般来说,广搜常用于找单一的最短路线,或者是规模小的路径搜索,它的 ...
最新文章
- nginx 负载均衡配置_Nginx负载均衡NFS配置
- 企业网站制作要以简约为主
- 2020-11-28(不定参数的函数)
- java定义final_Java中何时将方法声明为final的
- (JAVA)获取对象
- 程序员过端午的正确姿势,一般人看不懂
- 闲来无事实现个备忘录,到点提醒
- TestStand-调用LabVIEW
- 1.数独游戏(生成题目解唯一)
- 疑惑光栅投影中条纹间距和频率的关系
- java重载和重写的区别_Java重载和重写的区别
- 网站盈利有哪些模式?
- 提高农业品牌互联网曝光度的“四个一工程”
- HIDL服务死亡通知实例 hidl_death_recipient
- Hadoop源码分析(12)
- 可能是推荐系统最详细且简单的入门教程
- 使用java.io.File操作文件及文件夹
- python开发ps插件_你还在用PS?Python 20行代码批量抠图
- 【cocos creator】各小游戏平台sdk,vivo,oppo,wx,qq,字节跳动
- 网页登录邮箱如何恢复误删邮件?
热门文章
- cutterman 从安装到使用
- 英语基础-定语从句的特殊用法及写作应用
- IDM(Internet Download Manager)另存为路径的记录怎么删除
- chrome 浏览器,查看正在下载的文件地址
- 【毕业设计之微信小程序系列】基于APP的微信点餐小程序的设计与实现
- 《Imbalance Problems in Object Detection:A Review》论文笔记
- QPSK调制与解调原理
- 泛洪攻击以及防护方法
- 物联网技能大赛-Ubuntu-(2)
- dss_linkis(dataspherestudio-1.1.1、linkis-1.1.1)拓展工具安装——数据交换工具Exchangis