算法导论—无向图的遍历(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
很高兴能和大家一起共同学习算法导论这本书.笔者将在业余时间把算法导论后面的题解以博文的形式展现出来希望能得到大家的支持谢谢.如果有可能我会做一些教学视频免费的供大家观看. 练习题选自算法导论中文第三版 ...
随机推荐
- laravel 数据导出
支持:php 7.0 以上 三种方案总结介绍: 第一种:最简单且不会有长久隐患.但不适合数据量多 第二种: 适合中等数据量,不会有长久隐患.但导出时极占内存 第三种:适合大量数据,不会占据 ...
- python 装饰器模拟京东登陆
要求: 1.三个页面:主页面(home).书店(book).金融页面(finance)2.有两种登陆方式:主页面和书店页面使用京东账户登陆,金融页面使用微信账户登录2.输入:1 ,进入主页面,以此类推 ...
- 关于构造函数什么值传递给他的实例,只有this和prototype
var a= function (){var bb = 12; this.aa ="xxx"}; a.aa="www"; a.prototype.cc=&quo ...
- 使用JQuery.slideBox实现图片滚动效果
1.下载JQuery.slideBox和jquery插件,并引用 <link href="css/jquery.slideBox.css" rel="stylesh ...
- 大数据学习——mapreduce案例join算法
需求: 用mapreduce实现select order.orderid,order.pdtid,pdts.pdt_name,oder.amount from orderjoin pdtson ord ...
- java中String数组和List的互相转化
1.List转String数组 方法一: //先准备一个List List<String> testList=new ArrayList<>(); testList.add(& ...
- Poj1704:staircase nim【博弈】
题目大意:有一个无限长的一维的棋盘,棋盘上N个格子放置着棋子.两个人轮流操作,每次操作能选择其中一个棋子向左移动,但不能越过其它棋子或者两枚棋子放在同一格中,最后不能操作的人算输,问先手是否必胜? 思 ...
- 【树状数组+dp】HDU 5542 The Battle of Chibi
http://acm.hdu.edu.cn/showproblem.php?pid=5542 [题意] 给定长为n的序列,问有多少个长为m的严格上升子序列? [思路] dp[i][j]表示以a[i]结 ...
- Vim command handbook
/* 本篇文章已经默认你通过了vimtuor训练并能熟练使用大部分命令.此篇文章主要是对于tutor命令的总结和梳理.适合边学习边记忆 tutor那个完全是在学习中记忆 符合认知规律但是练习有限.所以 ...
- mybatis连接mysql加密实现
参考文章1 参考文章2 直接重写BasicDataSource接口的setPassword方法: 这里同样存在一个问题,就是在重写的方法中,我们可以对password,username 进行解密处理, ...