宽度优先遍历无向图

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

1.宽度优先遍历无向图

无向图是图论中常见的数据结构,其中边没有方向性,连接两个顶点的边是双向的。宽度优先遍历(Breadth-First Search, BFS)是一种用于遍历或搜索无向图的算法。与深度优先遍历不同,宽度优先遍历从图的某一顶点出发,逐层向外扩展,首先访问所有相邻的顶点,然后再访问这些顶点的未访问过的相邻顶点,以此类推。这种遍历方式在寻找最短路径、检测图的连通性等方面有着广泛的应用。

2.宽度优先遍历的基本原理

宽度优先遍历使用队列这种数据结构来保存待访问的顶点。算法从起始顶点开始,将其加入队列。然后,算法从队列中取出一个顶点,访问它,并将其所有未访问过的相邻顶点加入队列。这个过程一直重复,直到队列为空,即所有可达的顶点都被访问过。

3.宽度优先遍历无向图的步骤

  1. 初始化

    • 创建一个无向图,表示顶点和边的关系。
    • 初始化一个标记数组或集合,用于记录每个顶点的访问状态。所有顶点初始时都标记为未访问。
    • 初始化一个队列,用于存储待访问的顶点。
    • 选择一个起始顶点作为遍历的起点,并将其加入队列。
  2. 开始遍历

    • 当队列不为空时,从队列中取出一个顶点,并访问它。
    • 标记该顶点为已访问。
    • 遍历该顶点的所有相邻顶点。对于每个未访问过的相邻顶点,执行以下操作:
      • 将其加入队列。
      • 标记为已访问。
    • 重复上述步骤,直到队列为空。
  3. 输出结果

    • 当队列为空时,遍历结束。可以根据需要输出遍历的顺序、最短路径或其他相关信息。

4.宽度优先遍历无向图的代码实现

#include<iostream>
#define MAX 101
using namespace std;
int main(){
    int n,m,e[MAX][MAX],que[MAX],book[MAX],cur;
    cin>>n>>m;//元素个数和边数
    for (int i = 1; i <=n; i++)
        for (int j = 1; j <=n; j++)
        {
            if(i==j)e[i][j]=0;
            else e[i][j]=9;
        }
    int a,b;
    for (int i = 1; i <=m; i++){
        cin>>a>>b;
        e[a][b] = 1;
        e[b][a] = 1;
    }
    //queue
    int head=1,tail=1;
    que[1]=1;
    tail++;
    book[1]=1;
    while (head<tail&&tail<=n)
    {
        cur=que[head];
        for (int i = 1; i <=n; i++)
        {
            if(e[cur][i]==1&&book[i]==0)
            {
                book[i]=1;
                que[tail]=i;
                tail++;
            }
        }
        if(tail>n)break;
        head++;

    }
    
    for (int i = 1; i < tail; i++)
    {
        cout<<que[i]<<" ";
    }
    
    return 0;

}

相似写法

#include<iostream>
#define MAX 100
using namespace std;

int main(){
    int m,book[MAX+1]={0},n,e[MAX+1][MAX+1];
    cout<<"enter total line:";
    cin >>n>>m;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++){
        if(i==j)e[i][j]=0;
        else e[i][j]=9;
    }
    int a,b;
    for(int i=1;i<=m;i++){
        cin>>a>>b;
        e[a][b]=1;
        e[b][a]=1;}
    
    int head=1,tail=1;
    int que[MAX+1];
    que[1]=1;
    tail++;
    book[1]=1;//
    while(head<tail&&tail<=n){
        for(int i=1;i<=n;i++){
            if (e[que[head]][i]==1&&book[i]==0)//que[head]
            {
                book[i]=1;
                que[tail]=i;
                tail++;
            }
        }
        head++;
    }
    for(int i=1;i<tail;i++)
    cout<<que[i]<<" ";

    return 0;
}
/* 5 5
1 2
1 3
1 5
2 4
3 5 */

5.注意事项

注意book数组的初始化问题。写法二在出错后才改为book[MAX+1]={0},将错误解决。

深度优先宽度优先的区别、前(先)序遍历和中序遍历以及后序遍历的使用 深度优先 深度优先搜索属于图算法的一种 深度优先搜索是一种在开发爬虫早期使用较多的方法。它的目的是要达到被搜索结构的叶结点(即那些不包含任何超链的HTML文件) 过程:是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次. 深度优先遍历 深度优先遍历图的方法是,从图中某顶点v出发: 从图中一个未访问的顶点V开始 沿着一条路一直走到底 第二步路走完过后,再从这条路尽头的节点回退到上一个节点,再从另一条路开始走到底…不断递归重复2和3过程 一直执行3过程,直到所有的顶点都遍历完成(即所以顶点 阅读详情

相关推荐

educoder数据结构算法 图 第1关:实现图的宽度优先遍历

任务描述 本关任务:请你实现 graph.cpp 里的int Graph_WidthFirst(Graph*g, int start, Edge* tree)函数。 注意遵守约定:编号小的优先入队列。 相关知识 图 2 给出了对图 1 的无向图的存储结构图:每个顶点的名称由一个字符串描述,所有字符串的起始地址组织为一个数组,数组的起始地址为vetex;顶点的相邻关系保存在相邻矩阵中,其起始地址为adj,adj[i*n+j]的值为 1 表示i号顶点到j号顶点有边,为 0 表示无边,其中n是顶点个

qq_54008392的博客 1万+

C++数据结构算法分析——BFS(宽度优先遍历)

BFS 介绍 BFS也叫宽度优先遍历,广度优先遍历宽度优先搜索,广度优先搜索,是一种常用的搜索手段。

l_red_forest的博客 3292

宽度优先搜索算法(BFS)

先从左向右,再从右向左地对每一层节点进行遍历以示例1为例:即。

2301_76161469的博客 4423

图论(四)宽度优先搜索BFS

宽度优先搜索(BFS, Breadth First Search)是一个针对图和树的遍历算法。发明于上世纪50年代末60年代初,最初用于解决迷宫最短路径和网络路由等问题。对于下面的树而言,BFS方法首先从根节点1开始,其搜索节点顺序是1,2,3,4,5,6,7,8。 BFS使用队列(queue)来实施算法过程,队列(queue)有着先进先出FIFO(First Input First Outp

saltriver的专栏 1万+

无向图-邻接矩阵-宽度优先遍历-BFS C代码实现

一、BFS算法思路本算法无向图为例,存储方式采用邻接矩阵1)将该网以邻接矩阵的方式存储,由于这里的示例采用无向图,因此它是一个对称阵2)选取A点为起始点,访问此顶点,用一个visit的bool型数组记录访问状态(false表示未被访问,true表示已访问)3)从A的未被访问的邻接点出发,宽度优先遍历图,直到图中所有和v有路径相通的顶点都被访问到宽度优先遍历需要借助队列,思想与二叉树的层序遍历类似...

qiki_糖没味儿的程序媛小屋 5634

你知道java吗?请用java写出无向图宽度优先遍历的代码

是的,我知道 Java。以下是 Java 代码实现无向图宽度优先遍历: import java.util.*; public class BFS { private int V; // 顶点数目 private LinkedList<Integer> adj[]; // 邻接表 // 构造函数 BFS(int v) { V = ...

weixin_42587866的博客 59

图的宽度优先遍历

读入一个用邻接矩阵存储的无向图,输出它的宽度优先遍历序列。 输入 第 1 行 1 个正整数 n,表示图中顶点数,2≤n≤100; 接下来的 n 行是一个 n×n 的邻接矩阵,a[i][j]=1 表示顶点 i 和顶点 j 之间有直接边相连,a[i][j]=0 表示没有直接边相连。保证 i=j 时,a[i][j]=0,并且 a[i][j]=a[j][i]。 输出 输出 1~n 的某一种排列,表示从顶点 1 开始,对该图进行宽度优先遍历得到的顶点序列,每两个数之间用一个“-”分隔。 输入 8...

weixin_55599629的博客 2477

无向图-邻接链表-宽度优先遍历-BFS C代码实现

一、算法思路本算法无向图为例,存储方式采用邻接表1)将该网以邻接表的方式存储,由于这里的示例采用无向图,因此它是一个对称阵2)选取A点为起始点,访问此顶点,用一个visit的bool型数组记录访问状态(false表示未被访问,true表示已访问)3)从A的未被访问的邻接点出发,宽度优先遍历图,直到图中所有和v有路径相通的顶点都被访问到二、BFS测试用例        本算法的测试用例为《大话数据...

qiki_糖没味儿的程序媛小屋 789

南邮 OJ 1048 图的宽度优先遍历序列

图的宽度优先遍历序列 时间限制(普通/Java) : 1000 MS/ 3000 MS          运行内存限制 : 65536 KByte 总提交 : 633            测试通过 : 282  比赛描述 图(graph)是数据结构 G=(V,E),其中V是G中结点的有限非空集合,结点的偶对称为边(edge);E是G中边的有限集合。设V={0,1,2,……,n-1

呈凹的博客 579

图的宽度优先遍历序列

图(graph)是数据结构 G=(V,E),其中V是G中结点的有限非空集合,结点的偶对称为边(edge);E是G中边的有限集合。设V={0,1,2,……,n-1},图中的结点又称为顶点(vertex),有向图(directed graph)指图中代表边的偶对是有序的,用”<”u,v>代表一条有向边(又称为弧),则u称为该边的始点(尾),v称为边的终点(头)。无向图(undir

sundujing的博客 2451

1048-图的宽度优先遍历序列

描述 图(graph)是数据结构 G=(V,E),其中V是G中结点的有限非空集合,结点的偶对称为边(edge);E是G中边的有限集合。设V={0,1,2,……,n-1},图中的结点又称为顶点(vertex),有向图(directed graph)指图中代表边的偶对是有序的,用<u,v>代表一条有向边(又称为弧),则u称为该边的始点(尾),v称为边的终点(头)。无向图(undir...

weixin_30650039的博客 246

NOJ1048图的宽度优先遍历序列

图的宽度优先遍历序列 Time Limit(Common/Java):1000MS/3000MS          Memory Limit:65536KByte Total Submit:488            Accepted:216 Description 图(graph)是数据结构 G=(V,E),其中V是G中结点的有限非空集合,结点的偶对称为边(edge);E是G中

我的博客 798

C/C++ 邻接表建无向图 和 BFS DFS 遍历 算法

一、什么是邻接表 图的邻接表存储方法跟树的孩子链表示法相类似,是一种顺序分配和链式分配相结合的存储结构。 如这个表头结点所对应的顶点存在相邻顶点,则把相邻顶点依次存放于表头结点所指向的单向链表中。表结点存放的是邻接顶点在数组中的索引。 对于无向图来说,使用邻接表进行存储也会出现数据冗余,表头结点A所指链表中存在一个指向C的表结点的同时,表头结点C所指链表也会存在一个指向A的表结点。 二、如何用邻接表建无向图 定义表头结点 typedef struct VNode { //定义表头结点; Arc

Carizy的博客 3677

1048 图的宽度优先遍历序列 c语言

描述 图(graph)是数据结构G=(V,E),其中V是G中结点的有限非空集合,结点的偶对称为边(edge);E是G中边的有限集合。设V={0,1,2,……,n-1},图中的结点又称为顶点(vertex),有向图(directed graph)指图中代表边的偶对是有序的,用<u,v>代表一条有向边(又称为弧),则u称为该边的始点(尾),v称为边的终点(头)。无向图(...

diaoyuan6818的博客 487

【7043】利用邻接表实现无向图的广度优先遍历

#include<iostream> #include<queue> #include<string.h> using namespace std; typedef struct ArcNode { int adjvex; struct ArcNode* nextArc; }ArcNode; //边节点 typedef struct VNod...

Codes 934

图的基础知识(定义、深度优先遍历宽度优先遍历

图(Graph) 定义 由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V, E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合。 图分为无向图与有向图,根据有无图的边长,又分为带权图与不带权图。 如下图: 深度优先遍历 ...

weixin_46338206的博客 679

数据结构无向图邻接表、邻接矩阵创建及其BFS、DFS遍历(C语言)

实验目的: 1.掌握图的定义和构造方法; 2.掌握图的存储及遍历方法及应用。 实验内容: 编程实现: 1、建立一个以邻接表形式存储的图; 2、建立一个以邻接矩阵形式存储的图; 3、以邻接表形式存储的图的深度优先遍历; 4、以邻接表形式存储的图的广度优先遍历; 5、以邻接矩阵形式存储的图的深度优先遍历; 6、以邻接矩阵形式存储的图的广度优先遍历; 学习邻接表时候画的图,如果没有动态视频教程的话,个人觉得看着代码一层一层画图很容易理解 个人比较懒,下面是代码:(注释应该能看懂吧哈哈哈

weixin_55797565的博客 4496
上一篇: 深度优先遍历无向图
下一篇: 最全C语言数组初始化方法——可能解决不易找到的bug!
dinosaur2004
博客等级 码龄3年 612粉丝 18原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值