图的dfs遍历和bfs遍历

对如下图进行广度和深度遍历;

dfs遍历,(依次输出遍历顶点):

用邻接矩阵存图(用一个二维数组把图存起来)!

<span style="font-size:18px;">#include<stdio.h>
#define MAX 9999999//当顶点之间不相通时,标记为一个很大的数
int sum=0;//记录遍历的顶点的个数
int v,s;//顶点数和边数
int book[50]={0},p[30][30];//标记数组和矩阵
void dfs(int k)
{
	printf("%d ",k);//打印顶点
	if(sum==v)//如果已遍历的顶点数等于总顶点数,则退出
	return ;
	for(int count=1;count<=v;count++)//对所有的顶点进行遍历,看哪一个和这个顶点有关系
	{
		sum++;
		if(book[count]==0&&p[k][count]==1)//既没有被访问过,而且和当前顶点还有关系
		{
			book[count]=1;//把此顶点进行标记
			dfs(count);//接着对下一个顶点进行深度搜索
		}
	}
}
int main(void)
{
	int x,y;
	scanf("%d%d",&v,&s);//输入顶点和边数
	for(int i=1;i<=v;i++)
	for(int j=1;j<=v;j++)
	{
		p[i][i]=0;//顶点自己到自己设置为0
		p[i][j]=MAX;//其余的暂且都设置为最大值
	}
	for(int k=1;k<=s;k++)//输入边数
	{
		scanf("%d%d",&x,&y);
		p[x][y]=1;//因为是无向图,所以如果x到y有通路,那么y到x也有通路
		p[y][x]=1;
	}
	book[1]=1;//把第一个顶点标记为已访问
	dfs(1);//从第一个顶点开始深搜
	return 0;
}</span>

图的bfs遍历:

<span style="font-size:18px;">#include<stdio.h>
#define MAX 9999999//此处只是相对的最大值 

int main(void)
{
	int queue[50];//必须保证能存放所有的顶点
	int book[50]={0};//标记数组
	int p[50][50];
	int v,s,head=1,tail=1,a,b;//把头尾指针初始化为 1
	scanf("%d%d",&v,&s);
	for(int i=1;i<=v;i++)//存图的矩阵是一个正方形
	for(int j=1;j<=v;j++)
	{
		p[i][i]=0;//主对角线都是0,因为是自身到自身
		p[i][j]=MAX;
	}
	for(int k=1;k<=s;k++)
	{
		scanf("%d%d",&a,&b);
		p[a][b]=1;
		p[b][a]=1;
	}
	queue[tail]=1;//第一个顶点入队
	book[1]=1;
	 tail++;
	 while(head<tail)
	 {
	 	for(int k=1;k<=v;k++)
		 {
		 	if(book[k]==0&&p[queue[head]][k]==1)//既没有被标记,又和当前顶点有关系
		 	{
		 		queue[tail]=k;//当前顶点入队
		 		book[k]=1;
		 		tail++;
		 	}
		 }
		 head++;
	 }
	 for(int k=1;k<tail;k++)//注意;虽然是出队,但是并没有删除,只是指针向后移,而暂且用不到前面的数据,所以前面的数据仍然可以输出
	 {
	 	printf("%d ",queue[k]);
	 }
	 printf("\n");
	 return 0;
}</span>
时间: 2024-08-05 19:18:50

图的dfs遍历和bfs遍历的相关文章

图的遍历(BFS、DFS的邻接矩阵和邻接表实现)

当年老师给我们讲这里的时候,讲的真是云里雾里的. .其实画个图就很容易理解的事情,为什么扯那么远 我觉得 DFS其实就是树的先序遍历的强化版本 BFS是层序遍历的强化 只不过 图的实现方式比较多元化 而且不像二叉树有明确的根 操作起来相对难一些 理论其实很好理解 就是具体操作起来 每次都很晕的样子 眼高手低了又. 图的遍历是指从图中的任一顶点出发,对图中的所有顶点访问一次且只访问一次.图的遍历操作和树的遍历操作功能相似.图的遍历是图的一种基本操作,图的许多其它操作都是建立在遍历操作的基础之上.

图的遍历(bfs 和dfs)

BFS的思想: 从一个图的某一个顶点V0出发,首先访问和V0相邻的且未被访问过的顶点V1.V2.……Vn,然后依次访问与V1.V2……Vn相邻且未被访问的顶点.如此继续,找到所要找的顶点或者遍历完整个图. 由此可以看出,用BFS进行搜索所搜索的顶点都是按深度进行扩展的,先找到到V0距离为1的所有顶点,然后找到距离V0为2的顶点……所以BFS所搜索到的都是最短的路径. 由于要将距离V0为d(d>0)的且未被方位的点都记录起来,我们采用队列这种数据结构.队列的特点是先进先出(FIFO),从某个顶点出

rwkj 1501 数据结构:图的DFS遍历

数据结构:图的DFS遍历 时间限制(普通/Java):1000MS/3000MS            运行内存限制:65536KByte 总提交:259            测试通过:183 描述 从已给的连通图中某一顶点出发,沿着一些边访遍图中所有的顶点,且使每个顶点仅被访问一次,就叫做图的遍历.图的遍历的遍历有DFS和BFS两种. 上面的图,从顶点0出发,按照顶点序号从小到大的顺序DFS,得到遍历顺序为0 1 2 3  4 5 6 7 8. 输入 输入图的顶点个数(<20)与边数,以及每

深度优先遍历(DFS)和广度优先遍历(BFS)

1 图的两种存储方式 1.1 邻接矩阵(Adjacency Matrix) 1.1.1 原理 用一维数组存储图中顶点信息:用二维数组(矩阵)存储图中的边和弧的信息.对于无向图来说,如果顶点i与顶点j之间有边,就将A[i][j]和A[j][i]标记为1:对于有向图来说,如果顶点i和顶点j之间,有一条箭头从顶点i指向顶点j的边,就将A[i][j]标记为1,有箭头从顶点j指向顶点i的边,就将A[j][i]标记为1.对于有权图,数组中存储相应权重. 邻接矩阵可表示为: vertex[4] = {v0,

学习笔记:图的DFS和BFS的两种搜索办法

  在学习图结构的过程中,DFS和BFS是两种不同的遍历方式,其寻找元素具有不同的优点和缺陷. BFS被称作广度优先算法, 在遍历整个图的过程中,BFS将采用入队的方式进行,值得一提的是,这和树结构中的层序遍历有很大的相似之处. 在层序遍历中,将父亲节点入队后,在父亲节点出队后,将其儿子节点入队. 同理在图的BFS遍历中,先让BFS的首元素入队,在收元素入队后将他的儿子节点入队,放能够实现BFS搜索,他们的整体思想是一样的. 1 void TraversalGraph_BFS(LGraph Gr

图的广度优先遍历和深度优先遍历

图是一种很重要的数据结构,在我们的编程生活中应用极其广泛 #include <iostream> using namespace std; #define INFINITY 32767 #define MAX_VEX 20 //最大顶点个数 #define QUEUE_SIZE (MAX_VEX+1) //队列长度 bool *visited; //访问标志数组 //图的邻接矩阵存储结构 typedef struct { char *vexs; //顶点向量 int arcs[MAX_VEX]

树的常见算法&amp;图的DFS和BFS

树及二叉树: 树:(数据结构中常见的树) 树的定义 树的存储:下面介绍三种不同的树的表示法:双亲表示法,.孩子表示法,.孩子兄弟表示法. 双亲表示法 我们假设以一组连续空间存储树的结点,同时在每个结点中,附设一个指示器指向其双亲结点到链表中的位置.也就是说每个结点除了知道自己之外还需要知道它的双亲在哪里. 它的结构特点是如图所示: 以下是我们的双亲表示法的结构定义代码: /*树的双亲表示法结点结构定义 */ #define MAXSIZE 100 typedef int ElemType; //

图的邻接矩阵表示方法以及遍历

下面的程序可以用来创建有向图,有向网,无向图,无向网.对于图来说如果来个顶点之间存在边,则在矩阵中用1表示,无边则用0表示.在网络中,边是对应权值的. 图的遍历可以分为深度优先遍历和广度优先遍历. 深度优先遍历的思想是,选择某个未被访问的顶点并访问,然后从该顶点出发,选择第一个和该顶点邻接的未被访问的顶点进行访问.在该过程中可以设置一个标识数组flags[]来标识各个顶点是否被访问到. 广度优先搜索的思想是,选择某个未被访问的顶点并访问,然后依次访问该顶点所以的邻接顶点,对于每次被访问的顶点都对

图的表示、深度广度遍历算法及其应用

世间的一切对象都可化为节点:世间一切关系都可化为节点间的一条线:从而组成了如梦幻泡影的图.将来的环球必定是图的世界. 一.图的表示 图有有向图和无向图,表示方法一般有邻接表.邻接矩阵等方法,无向图和有向图都可以用这两种方法表示. 图1. 图的例子[1] 1.邻接表 在邻接表中,对于每个顶点u,使用一个链表把所有与u相邻的点点串起来,并标记这个集合为adj(u).举个栗子如下: 图2. 邻接表表示图的例子[1] 在真正操作图进行实验的时候,一般也都使用邻接矩阵表示,例如要存储图1中的有向图,可以直