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

学习笔记( 11 ) - 解决:finalshell连接虚拟机(ubuntu)超时,主机ping不通虚拟机,主机没有VMnet8网卡, Connection refused: connect

解决:finalshell连接虚拟机(ubuntu)超时,主机ping不通虚拟机,主机没有VMnet8网卡, Connection refused: connect

烟溪彭于晏的博客 2万+

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

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

m0_73633088的博客 2万+

告别臃肿VS!仅用Visual Studio 2022 Build Tools为Qt 5.12.12配置MSVC2017开发环境

本文详细介绍了如何仅使用Visual Studio 2022 Build Tools为Qt 5.12.12配置MSVC2017开发环境,避免安装臃肿的完整VS。通过精准选择组件、配置Qt Creator编译器和优化Kit设置,实现高效、精简的Windows平台Qt开发环境搭建,特别适合追求性能和资源优化的开发者。

weixin_30340617的博客 350

react-window 大数据列表和表格数据渲染组件之虚拟滚动

ReactWindow是一个高性能的React虚拟滚动组件库,专门用于高效渲染大型列表和表格数据。它通过“窗口化”技术,仅渲染用户可见区域的内容,大幅提升性能并减少内存消耗。主要特点包括:支持固定/可变大小列表项、多种布局类型(垂直/水平/网格)、轻量级设计(不足5KB)以及平滑的滚动体验。相比传统渲染方式,它能轻松处理成千上万条数据,并提供自动滚动、自适应容器大小等高级功能。与同类库相比,ReactWindow具有更简洁的API和更优的性能表现,是处理大数据量渲染场景的理想选择。

前端开发-前端技术分享 1137

图的遍历:广度优先搜索(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

Windows版MySQL8.4.2LTS解压直用(下载免安装-绿色-项目打包直接使用-含卸载)

安装前运行微软常用运行库全集(也可能称为依赖)关于MySQL8中相关参数配置,可通过。选择8.5.2LTS长期服务版。选中密码,右键会直接复制。

xzzteach的博客 1440

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

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

风一样的少年 397

AI Agent开发大全第一课-AI是什么以及如何使用AI

近年来,人工智能的迅猛发展引发了广泛的关注,尤其是“大模型”这一概念越来越深入人心。大模型,顾名思义,通常指的是那些拥有大量参数、能够处理复杂任务的机器学习模型。与传统小模型相比,大模型在数据处理、信息理解和生成等方面表现更加出色。为了理解为什么现在的AI被称为大模型,我们需要深入探讨几个关键因素。立角色是指在提示词中清晰地界定交互双方的身份。明确用户希望模型扮演的角色,可以帮助模型更准确地理解上下文和用户需求。

打造全国最全的AI Agent开发知识领域的博客 1406

量化交易零基础入门教程

特点 从零开始教编程。靠谱的量化交易学习资源稀少,且具有不讲编程、代码较难、过多等不适合新手等问题,本教程中则会从零开始教编程,解决量化入门过难过编程门槛这一问题。 量化与编程相结合。本教程不仅会教编程,而且会尽量结合量化情景,减少“我要做量化交易为什么要看这些用来培训程序员的东西”的愤懑。 简易精炼,快速入门。尽量只讲最核心最常用的知识,助你快速摆脱想学习量化却处处陌生不知所措的茫然的新手阶段。 读前说明 文后会有自测与自学,包括一些额外的延伸自学内容以及稍有难度的自测题目。 最最最基础的股票.

JanLEE 2886

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

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

weixin_30908649的博客 171

CH-x01&ICU-x0201-问答专题

CH201在近距离30cm和远距离1.8m左右测距误差是最大的,误差可能>3 cm。在中间部分测距误差是<2cm的,因为考虑到安装测试治具也存在误差,所以整个范围设置在±3cm。

nicole088的专栏 379

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

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

stary_yan的博客 3万+

图机器学习(1)——图论基础

图 (Graph) 是一种描述实体间关系的数学结构,几乎在各个领域都有应用。例如,社交网络就是图,其中用户之间的连接取决于一个用户是否“关注”另一个用户。图论,即对图的研究,一直以来广受关注,包含了大量算法、性质分析方法和数学模型,以解析复杂系统的行为特征。本节将介绍图数据结构的核心概念,通过理论阐述与实例演示相结合的方式,理解基础理论用以实践应用。重点介绍用于创建、操作和研究复杂网络结构与功能的 Python 库。

盼小辉丶的博客 9077

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

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

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

weixin_30612769的博客 1098

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

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

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

°渐行渐远っ的博客 640

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

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、付费专栏及课程。

余额充值