算法导论—无向图的遍历(BFS+DFS,MATLAB)
华电北风吹
天津大学认知计算与应用重点实验室
最后改动日期:2015/8/22
无向图的存储方式有邻接矩阵,邻接链表,稀疏矩阵等。
无向图主要包括双方面内容,图的遍历和寻找联通分量。
一、无向图的遍历
无向图的遍历有两种方式—广度优先搜索(BFS)和深度优先搜索(DFS)。广度优先搜索在遍历一个顶点的全部节点时,先把当前节点全部相邻节点遍历了。然后遍历当前节点第一个相邻的节点的全部相邻节点,广度优先搜索使用队列来实现。深度优先搜索在遍历当前节点的全部相邻节点时,先对当前节点的第一个相邻节点进行訪问。然后遍历第一个相邻节点的相邻节点。依次递归,因此深度优先搜索使用栈实现。
1、BFS图遍历代码:
function result=BFSTraversal(startNode,Graph)
% 广度优先搜索
% Graph 图连通矩阵
[m n]=size(Graph);
nodelist=zeros(m,1);
queue=startNode;
nodelist(startNode)=1;
result=startNode;
while isempty(queue)==false
i=queue(1);
queue(1)=[];
for j=1:n
if(Graph(i,j)>0&&nodelist(j)==0&&i~=j)
queue=[queue;j];
nodelist(j)=1;
result=[result;j];
end
end
end
2、DFS图遍历代码
function result=DFSTraversal(startNode,Graph)
global nodelist
m=size(Graph,1);
nodelist=zeros(m,1);
result=DFSRecursion(startNode,Graph);
function result=DFSRecursion(startNode,Graph)
global nodelist
nodelist(startNode)=1;
result=[startNode];
n=size(Graph,2);
for j=1:n
if(Graph(startNode,j)>0&&nodelist(j)==0&&startNode~=j)
result=[result DFSRecursion(j,Graph)];
end
end
二、寻找联通分量
寻找联通分量的方法就是把一个节点的全部相邻节点找出来,然后再在未訪问过的节点中选择一个节点用遍历方法寻找相邻节点。
1、基于BFS的寻找联通分量代码:
function resultSet=BFSDivideGraph(Graph)
% 连通分量(广度优先搜索)
% Graph 图连通矩阵,无向图。对称矩阵
resultSet=[];
[m n]=size(Graph);
nodelist=zeros(m,1);
p=1;
for k=1:m
if(nodelist(k)==0)
startNode=k;
queue=startNode;
nodelist(startNode)=1;
result=startNode;
while isempty(queue)==false
i=queue(1);
queue(1)=[];
for j=1:n
if(Graph(i,j)>0&&nodelist(j)==0&&i~=j)
queue=[queue;j];
nodelist(j)=1;
result=[result;j];
end
end
end
resultSet(p).graph=result;
p=p+1;
end
end
2、基于BFS的寻找联通分量代码:
在訪问记录链表中选择未訪问过的节点作为深度优先搜索的起点直到全部节点都被訪问过就可以。
三、图的高级应用
1、BFS
最短路径(Dijkstra)。最小生成树(Prim)。拓扑排序
2、DFS
拓扑排序,强连通分量
本文代码基于邻接矩阵实现。
算法导论—无向图的遍历(BFS+DFS,MATLAB)的更多相关文章
- 图的创建和遍历(BFS/DFS)
图的表示方法主要有邻接矩阵和邻接表.其中邻接表最为常用,因此这里便以邻接表为例介绍一下图的创建及遍历方法. 创建图用到的结构有两种:顶点及弧 struct ArcNode { int vertexIn ...
- 模板 图的遍历 bfs+dfs 图的最短路径 Floyed+Dijkstra
广搜 bfs //bfs #include<iostream> #include<cstdio> using namespace std; ],top=,end=; ][]; ...
- 图文详解两种算法:深度优先遍历(DFS)和广度优先遍历(BFS)
参考网址:图文详解两种算法:深度优先遍历(DFS)和广度优先遍历(BFS) - 51CTO.COM 深度优先遍历(Depth First Search, 简称 DFS) 与广度优先遍历(Breath ...
- 【算法导论】图的深度优先搜索遍历(DFS)
关于图的存储在上一篇文章中已经讲述,在这里不在赘述.下面我们介绍图的深度优先搜索遍历(DFS). 深度优先搜索遍历实在访问了顶点vi后,访问vi的一个邻接点vj:访问vj之后,又访问vj的一个邻接点, ...
- "《算法导论》之‘图’":深度优先搜索、宽度优先搜索(无向图、有向图)
本文兼参考自<算法导论>及<算法>. 以前一直不能够理解深度优先搜索和广度优先搜索,总是很怕去碰它们,但经过阅读上边提到的两本书,豁然开朗,马上就能理解得更进一步. 下文将会用 ...
- BFS/DFS算法介绍与实现(转)
广度优先搜索(Breadth-First-Search)和深度优先搜索(Deep-First-Search)是搜索策略中最经常用到的两种方法,特别常用于图的搜索.其中有很多的算法都用到了这两种思想,比 ...
- 图的深度优先遍历(DFS)和广度优先遍历(BFS)
body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...
- 广度优先遍历-BFS、深度优先遍历-DFS
广度优先遍历-BFS 广度优先遍历类似与二叉树的层序遍历算法,它的基本思想是:首先访问起始顶点v,接着由v出发,依次访问v的各个未访问的顶点w1 w2 w3....wn,然后再依次访问w1 w2 w3 ...
- 算法导论课后习题解答 第一部分 练习1.1-1->1.1-5
很高兴能和大家一起共同学习算法导论这本书.笔者将在业余时间把算法导论后面的题解以博文的形式展现出来希望能得到大家的支持谢谢.如果有可能我会做一些教学视频免费的供大家观看. 练习题选自算法导论中文第三版 ...
随机推荐
- ffmpeg解析TS流
介绍: MPEG的系统层编码为不同的应用场景设计了两种格式: TS(Transport Stream) 和PS(Program Stream), 它们两者之间不具有层级关系, 在逻辑上,它们两者都 ...
- HLS协议详解
1. HLS HLS是为移动设备开发的基于HTTP的流媒体解决方案. 2. 原理: 将视频或流切分成小片(TS), 并建立索引(M3U8). 支持视频流:H.264: 音频流:AAC 3. M3U8文 ...
- 【亲测可行】Dev c++调试、运行报错解决方法总结
一.编译后 0错误 0警告,但是开始出现‘‘停止运行’’或者进行输入时出现‘‘停止运行’’ 可能的原因: 结构体指针为空,但调用了其成员. 有些scanf语句中忘记添加取址符. 无法跳出递归. 二. ...
- Linux硬盘的检测--smartctl详细介绍
概述 随着硬盘容量.速度的快速发展,硬盘的可靠性问题越来越重要,今天的单块硬盘存储容量可轻松达到1TB,硬盘损坏带来的影响非常巨大.不同的文件系统(xfs,reiserfs,ext3)都有自己的检测 ...
- Linux基础测试
目 录 第1章 文件及目录课后作业 1 第2章 Linux打包与压缩习题 1 第3章 Linux系统VIM编辑器习题 1 文件及目录课后作业 从/proc/meminfo中过滤出 ...
- xtu summer individual 2 C - Hometask
Hometask Time Limit: 2000ms Memory Limit: 262144KB This problem will be judged on CodeForces. Origin ...
- php-fpm.conf
[global]pid = /usr/local/php/var/run/php-fpm.piderror_log = /usr/local/php/var/log/php-fpm.loglog_le ...
- F题
Problem F Codeforces 16E 这道题是一道数位Dp将鱼的死活列为0两种状态然后找DP关系 •题意:有n(n<=18)条鱼,接下来的n-1天,每天会有一对鱼(a,b)相遇,每天 ...
- PHP建立和删除目录
<?php/*linux中的文件权限filedir 用户 组 其它 rwx rwx rwx 读写执行 6 4 6 读写 读 读写 7 7 7 rw_ r__ rw_ r__ _w_ ___ r ...
- PHP目录文件遍历
<meta charset="utf-8"><?php //遍历文件中的所有文件名称 foreach(glob("phpmyadmin/*") ...