ACM入门(3)——图的遍历——广度优先搜索

图的广度优先遍历 本文要解决的问题: 总结一下图的广度优先遍历 简述 广度优先遍历算法是图的另一种基本遍历算法,其基本思想是尽最大程度辐射能够覆盖的节点,并对其进行访问。以迷宫为例,深度优先搜索更像是一个人在走迷宫,遇到没有走过就标记,遇到走过就退一步重新走;而广度优先搜索则可以想象成一组人一起朝不同的方向走迷宫,当出现新的未走过的路的时候,可以理解成一个人有分身术,继续从不同的方向走,,当相遇的 阅读详情

ACM入门(3)——图的遍历——广度优先搜索
基本算法:
由Moore和Lee独立提出
给定图G和一个源点s, 广度优先遍历按照从近到远的顺序考虑各条边. 算法求出从s到各点的距离
广度优先的过程对结点着色.
白色: 没有考虑过的点
黑色: 已经完全考虑过的点
灰色: 发现过, 但没有处理过, 是遍历边界
依次处理每个灰色结点u, 对于邻接边(u, v), 把v着成灰色并加入树中, 在树中u是v的父亲(parent)或称前驱(predecessor). 距离d[v] = d + 1
整棵树的根为s

BFS算法:
BFS(G,s)//从s点开始对图G广度优先搜索for each vertex u∈V[G]-{s}        do color← white//每个点赋值为未处理          d←∞  //每个点与源点的距离标志为∞∏←NIL       //每个点赋值为没有父亲color[s] ←gray              //s点标为正在处理d[s] ←0                     //s点与源点的距离为0Q ←ф                   //建空队列保存灰色顶点ENQUEUE(Q,s)       //源点入队列While(Q≠ф)    do u ←DEQUEUE(Q);//从队列中拿出一个元素进行处理         for each v ∈Adj //对没有处理过的邻接点进行处理              do  if  color[v]=white                        then color[v] ←gray                                d[v]=d+1∏[v]=u                                ENQUEUE(Q,v)         color=black//标记为处理完毕

用BFS求最短路:
定理: 对于无权图(每条边的长度为1), BFS算法计算出的d是从s到i的最短路
满足d=1的点一定是正确的(因为长度至少为1), 并且其他点都满足d>1. 容易证明对于任意距离值x, d=x的点一定是正确的, 而且白色点(没有计算出距离的点)的距离一定至少为x+1
更进一步, 根据每个点的parent值, 可以计算出它到s的一条最短路
Bfs算法中路径的打印
Print-Path(G,s,v)
①   if(v==s)
②        then print s
③        else if ∏[v]=NIL
④                  then print “no path from ”s”to” v”exits”
⑤                  else Print-path(G,s, ∏[v])
⑥                         print v

来看这个例子:
HDU1372

Knight Moves
Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 859    Accepted Submission(s): 535
Problem Description A friend of you is doing research on the Traveling Knight Problem (TKP) where you are to find the shortest closed tour of knight moves that visits each square of a given set of n squares on a chessboard exactly once. He thinks that the most difficult part of the problem is determining the smallest number of knight moves between two given squares and that, once you have accomplished this, finding the tour would be easy.
Of course you know that it is vice versa. So you offer him to write a program that solves the "difficult" part.

Your job is to write a program that takes two squares a and b as input and then determines the number of knight moves on a shortest route from a to b.
Input
The input file will contain one or more test cases. Each test case consists of one line containing two squares separated by one space. A square is a string consisting of a letter (a-h) representing the column and a digit (1-8) representing the row on the chessboard.
Output
For each test case, print one line saying "To get from xx to yy takes n knight moves.".
Sample Input
e2 e4
a1 b2
b2 c3
a1 h8
a1 h7
h8 a1
b1 c3
f6 f6
Sample Output
To get from e2 to e4 takes 2 knight moves.
To get from a1 to b2 takes 4 knight moves.
To get from b2 to c3 takes 2 knight moves.
To get from a1 to h8 takes 6 knight moves.
To get from a1 to h7 takes 5 knight moves.
To get from h8 to a1 takes 6 knight moves.
To get from b1 to c3 takes 1 knight moves.
To get from f6 to f6 takes 0 knight moves.

题目来源于国际象棋,即计算骑士(相当于中国象棋中的马)从棋盘的一点走到另一点所需最少步数,即最短路径,正好可以用广度优先遍历来实现。
代码如下:(C++实现)
#include <iostream>
#include <queue>
using namespace std;
struct Point//建一个坐标结构体来保存位置坐标
{
       int x,y;
       Point(int a,int b)//设置构造函数
       {
              x=a;
              y=b;
       }
};
bool mark[9][9];//用bool的二维数组来记录某点是否访问过
int map[9][9];//建二维数组来保存图,其数值代表从起始点到此的步数
int step[8][2]={{2,1},{1,2},{-1,2},{2,-1},
{-2,1},{1,-2},{-1,-2},{-2,-1}};//一个8*2的数组代表每次可能走的方式
inline bool in_map(const Point& p)//判断该坐标是否在棋盘内
{
       return p.x>0&&p.x<9&&p.y>0&&p.y<9;
}
int main()
{
       int a1,a2;
       char c1,c2;
       while(cin>>c1>>a1>>c2>>a2)
       {
              memset(mark,false,sizeof(mark));//对标记数组初始化为未标记
              memset(map,0,sizeof(map));//对map数组初始化为0步
              Point p1(c1-'a'+1,a1);//用Point保存起点和终点坐标
              Point p2(c2-'a'+1,a2);
              queue<Point> q;//建队列保存将要处理的坐标
              mark[p1.x][p1.y]=true;//将起点坐标标记为访问过
              q.push(p1);//将起点坐标放入队列
              while(!q.empty())
              {
                     Point p=q.front();//将队首元素取出
                     q.pop();//将队首元素删除
                     if(p.x==p2.x&&p.y==p2.y)//如果当前坐标为终点就跳出循环
                            break;
                     for(int i=0;i<8;++i)//循环八次尝试每次所能走的八种情况
                     {
                            Point temp(p.x+step[0],p.y+step[1]);//将下一步坐标保存在temp中
                            if(in_map(temp)&&!mark[temp.x][temp.y])//判断未访问过且在棋盘内
                            {
                                   mark[temp.x][temp.y]=true;//将其标为访问过
                                   map[temp.x][temp.y]=map[p.x][p.y]+1;//步数在前一步基础上加一
                                   q.push(temp);//同时将其放入队列等待下次操作
                            }
                     }
              }
              cout<<"To get from "<<c1<<a1//按要求输出结果
                     <<" to "<<c2<<a2
                     <<" takes "<<map[p2.x][p2.y]
                     <<" knight moves./n";
       }
       return 0;
}

0x21.搜索 - 树与图的遍历、拓扑排序 目录一、树与图的深度优先遍历及树的一些性质1.树与图的深度优先遍历2.时间戳3.树的DFS序(树链剖分前驱知识)4.树的深度5.树的重心与sizesizesize6.图的连通块划分二、树与图的广度优先搜索三、拓扑排序 声明: 本系列博客是《算法竞赛进阶指南》+《算法竞赛入门经典》+《挑战程序设计竞赛》的学习笔记,主要是因为我三本都买了 按照《算法竞赛进阶指南》的目录顺序学习,包含书中的少部分重要知识点、例题解题报告及我个人的学习心得和对该算法的补充拓展,仅用于学习交流和复习,无任何商业用途。博客中部分内 阅读详情

相关推荐

图论|图的构造、图的遍历方式、DFS98. 所有可达路径;海岛数量 岛屿最大面积 101. 孤岛的总面积

在有向图中,每个节点有出度和入度。出度:从该节点出发的边的个数。入度:指向该节点边的个数该无向图中 节点1、节点2、节点5 构成的子图就是 该无向图中的一个连通分量,该子图所有节点都是相互可达到的。同理,节点3、节点4、节点6 构成的子图 也是该无向图中的一个连通分量。那么无向图中 节点3 、节点4 构成的子图 是该无向图的联通分量吗?不是!

Calliops的博客 1496

PIPIOJ 1397:图的遍历——广度优先搜索

题目描述: 广度优先搜索遍历类似于树的按层次遍历的过程。其过程为:假设从图中的某顶点v出发,在访问了v之后依次访问v的各个未曾被访问过的邻接点,然后分别从这些邻接点出发依次访问它们的邻接点,并使“先被访问的顶点的邻接点”先于“后被访问的顶点的邻接点”被访问,直至图中所有已被访问的顶点的邻接点都被访问到。若此时图中尚有顶点未被访问,则另选图中一个未曾被访问的顶点作为起始点。重复上述过程,直至图中所有顶点都被访问到为止。 在本题中,读入一个无向图的邻接矩阵(即数组表示),建立无向图并按照以上描述中的算法遍历所有

已归档 996

应广单片机 按键点灯 PMS171B GPIO LED

我也是第一次使用这款单片机,参考网友的资料,写个最近简单的demo 测试用例 #include "extern.h" /*端口定义*/ BIT KEY : PA.0; BIT SW : PA.4; /*相应于main函数*/ void FPPA0 (void) { /*单片机内部RC震动时钟为 IHRC默认为16M,因此,IHRC/2=8M,系统时钟为8M*/ .ADJUST_IC...

大江的专栏 1000

图(graph)的遍历-----广度优先遍历(BFS)

​ 广度优先搜索(Breadth First Search)简称广搜或者 BFS,是遍历图存储结构的一种算法,既适用于无向图(网),也适用于有向图(网)。 广度优先遍历是一种图和树的遍历策略,它的核心思想是从一个起始节点开始,访问其所有邻近节点,然后再按照相同的方式访问这些邻近节点的邻近节点。这种遍历方式类似于波纹在水面上扩散的过程。 ​

m0_73633088的博客 2万+

Ubuntu20.04安全重启后WiFi图标消失?MT7922网卡驱动修复全攻略

本文详细解析了Ubuntu20.04安全重启后WiFi图标消失的问题,特别是针对MT7922网卡驱动失效的情况。通过诊断命令和分步解决方案,包括禁用PCIe ASPM、更新无线固件和升级HWE内核,帮助用户快速恢复网络连接。文章还提供了进阶排查技巧和系统优化建议,确保WiFi稳定运行。

weixin_29202687的博客 369

YOLO模型使用jupyterlab的方式进行预测/推理(示例)

首先相信很多使用过python的人都或多或少地了解过这个应用。是一个开源Web应用程序,可让用户创建和共享包含实时代码、公式、可视化和叙述文本的文档。用途包括:数据清理和转换、数值模拟、统计建模、等等。而Jupyter Lab则是Jupyter的下一代笔记本界面。是一个基于Web的交互式开发环境,用于Jupyter notebook、代码和数据。非常灵活,可支持数据科学、科学计算和机器学习领域的广泛工作。是可扩展和模块化的,其可编写插件来添加新组件并与现有组件相集成。

ocean00008899的博客 902

图的遍历:广度优先搜索(BFS)

广度优先搜索(Breadth First Search) 广度优先搜索遍历类似于树的按层序遍历 广度优先搜索遍历连通图 void BFS(Graph G, int v){ cout << v; //输入某个顶点在一维数组中的下标 visited[v]=true; //访问第v个顶点,并置访问标志数组相应值为true InitQueue(Q); //初始化队列 EnQueue(Q,v); //将下标为v的顶点加入队列 while(!QueueEmpty(Q)){ //队列非空

一个搬运知识的笨小孩 6483

3.1使用Python读取excel的二维数据

要使用 Python 读取 Excel 的二维数据,可以使用 openpyxl 或 pandas 库。

kenshin1980的专栏 1032

【ACM算法】-- 搜索篇 - 广度优先搜索(BFS)

思路: 这是一个典型的广搜问题,首相明确一个观点,无论是广搜还是深搜,其都是基于状态的,不同的是,广搜的状态是存储在struct里面的,深搜的状态是存储在形参里面的。然后广搜是基于当前状态,将所有下一状态放入队列,只走一步,深搜是基于当前状态,尽最大可能向下一步走,直到走不了为止。所以基于以上特点,广搜可以用来求一些最优化问题,例如求最短路径,而深搜只能确认一个图的连通性,或者说端点到端点...

风一样的少年 397

SAP产品合规(Product Compliance)管理—规格主数据 CG02/CG02WB

SAP产品合规(Product Compliance)管理—规格主数据概览 CG02/CG02WB

Lucas1211的博客 1430

sas协议(SAS PL-3)之Zoning功能

1 Zoning overview SAS zoning is implemented by a set of zoning expander devices with zoning enabled that define a zoned portion of a service delivery subsystem (ZPSDS)服务子系统. The zoning expander devices control whether a phy is permitted to participate in

sinat_37817094的博客 1530

ACM题目————图的广度优先搜索

题目描述 图的广度优先搜索类似于树的按层次遍历,即从某个结点开始,先访问该结点,然后访问该结点的所有邻接点,再依次访问各邻接 点的邻接点。如此进行下去,直到所有的结点都访问为止。在该题中,假定所有的结点以“A”--“Z”中的若干字符表示,且要求结点的访问顺序要求根据由 “A”至“Z”的字典顺序进行访问。 输入 输入只包含一个测试用例,第一行为一个自然数n,表示顶点的个数,第二行为n个...

weixin_30908649的博客 171

uniapp 如何封装实现任意页面都能使用的全局弹窗

项目内容场景全局监听消息提示难点uniapp 无法全局挂载组件解决方案动态创建 DOM + 动态 Vue 实例优势跨页面 / 不依赖页面组件树 / 灵活调用如果你使用的是小程序平台,DOM 操作可能受限,需要用或方式兼容处理。想支持多个弹窗堆叠?你可以扩展,加个弹窗队列管理器。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 944

[C++]广度优先搜索(BFS)(附例题)

广度优先搜索(BFS)(附例题)问题产生:Isenbaev是国外的一个大牛。现在有许多人要参加ACM ICPC。一共有n个组,每组3个人。同组的3个人都是队友。大家都想知道自己与大牛的最小距离是多少。大牛与自己的最小距离当然是0。大牛的队友和大牛的最小距离是1。大牛的队友的队友和大牛的最小距离是2……以此类推。如果实在和大牛没有关系的只好输出undefined了。第一行读入n。表示有n个组。1 ≤

stary_yan的博客 3万+

Oracle EBS的帐套由“4C”构成,而华为MetaERP将其发展为“6C”

华为MetaERP从OracleEBS的"4C"架构升级为"6C",实现核算理念革新。核心突破在于将会计科目、核算维度和核算单元解耦,形成"科目表+维度库"的灵活架构。新架构优势显著:1)科目回归会计本质,管理维度独立扩展;2)支持无限维度的精细化核算;3)实现数据权限隔离和内部交易自动化;4)采用元数据驱动设计,为AI应用奠定基础。这一平台化架构解决了大型企业在全球化、多元化发展中的核算难题,相比传统架构具有更强的灵活性和扩展性。

金牌架构师 204

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

图的遍历——广度优先搜索

问题 : 算法7-6:图的遍历——广度优先搜索时间限制: 1Sec 内存限制: 32MB题目描述广度优先搜索遍历类似于树的按层次遍历的过程。其过程为:假设从图中的某顶点v出发,在访问了v之后依次访问v的各个未曾被访问过的邻接点,然后分别从这些邻接点出发依次访问它们的邻接点,并使“先被访问的顶点的邻接点”先于“后被访问的顶点的邻接点”被访问,直至图中所有已被访问的顶...

weixin_30612769的博客 1098

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

数据结构实验之图论一:基于邻接矩阵的广度优先搜索遍历

数据结构实验之图论一:基于邻接矩阵的广度优先搜索遍历 Time Limit:1000 msMemory Limit:65536 KiB SubmitStatistic Problem Description 给定一个无向连通图,顶点编号从0到n-1,用广度优先搜索(BFS)遍历,输出从某个顶点出发的遍历序列。(同一个结点的同层邻接点,节点编号小的优先遍历) Input 输入第一...

°渐行渐远っ的博客 640

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

ACM入门之【图论习题】

目录P5318 【深基18.例3】查找文献【★】 P5318 【深基18.例3】查找文献【★】 考察的就是基础的图的遍历。 #include<bits/stdc++.h> using namespace std; const int N=1e5+10; vector<int>ve[N]; int n,m,st[N]; void dfs(int u) { cout<<u<<" "; st[u]=1; for(int i=0;i<v

辉小歌的博客 1051

acm第二十三次图的遍历

一、深度优先与广度优先遍历   从图中某一顶点出发系统地访问图中所有顶点,使每个顶点恰好被访问一次,这种运算操作被称为图的遍历。为了避免重复访问某个顶点,可以设一个标志数组visited[i],未访问时值为false,访问一次后就改为true。   图的遍历分为深度优先遍历和广度优先遍历两种方法,两者的时间效率都是O(n*n)。 1.深度优先遍历   深度优先遍历与深搜DFS相似,从一个点A出发,...

qq_43550247的博客 363

ACM从入门到???

ACM从入门到放弃 前言 写给我校新接触C语言的同学们,大概是ACM竞赛会涉及到的一些知识。因个人水平有限,同时我也是刚刚开始打ACM,内容并不会很深入。如有错漏之处,请加QQ:1208874505 联系我(Ice_teapoy)。具体内容大概有: 算法略讲 板子 奇怪的吐槽 其他 对刚刚接触算法竞赛的同学们的建议 1.如果对语言还不是很熟悉,请先多做一些入门题。不仅是为了掌握语言,更是为了熟悉编程思维。同时刷水题不要上瘾,只追求过题数量并不能真正提高水平。水题150~200左右应该开始比较系统的算法学

Ice_teapoy的博客 572

数据结构与算法——BFS(广度优先搜索)

广度优先搜索(Breadth-First Search,简称BFS)是一种遍历或搜索树和图的算法,也称为宽度优先搜索,BFS算法从图的某个节点开始,依次对其所有相邻节点进行探索和遍历,然后再对这些相邻节点的相邻节点进行探索,直到遍历完所有的节点。

闻道有先后,术业有专攻 1万+

ACM搜索入门问题模型的构建与分析

写在前面最近一段时间也集中刷了一些搜索的入门题,感觉应该对搜索问题进行一次总结。所以此篇博文是我针对写的题的简单分析,错误无法避免,如果发现欢迎留言改正。另外,由于是分析类的博文,所以代码会很少,算法的代码和题解这里不会出现哒^_^。如果对BFS和DFS的代码都不会,还是推荐学习一下图论以及具体代码,下面写的都是思想了(口胡技能EX)搜索基本算法:BFS与DFS关于BFS与DFS,即广度优先搜索与...

iwts 1080

Acm学习总结21

Acm学习总结21 图论分析: 图的遍历:1.深度优先遍历,这个遍历跟dfs差不多相似之处,从一点出发访问与之相连的其他点如果访问过了之后需要标记一下这个点再去访问其他的点; 具体代码实现: 下面给出的深度优先遍历的参考程序,假设图以邻接表存储  void dfs(int i) //图用数组模拟邻接表存储,访问点i  {    ...

ProgreamA的博客 210

图的深度和广度优先遍历

图的深度优先和广度优先

ACM-frank的博客 608
上一篇: ACM入门(1)——数据结构——并查集
下一篇: JAVA窗体最大化最小化控制+托盘
clbxp
博客等级 码龄21年 35粉丝 56原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值