广度优先和深度优先搜索算法

#include <iostream>
#include <stdlib.h>
#include <vector>
#include <string>
#include <queue>
#include <stack>
using namespace std;
//邻接矩阵显示图
void show_graph(vector<vector<int>> &graph)
{
	for (int i = 0; i < graph.size(); i++)
	{
		for (int j = 0; j < graph[i].size(); j++)
		{
			cout << graph[i][j] << "    ";
		}
		cout << endl;
	}
}

//邻接矩阵----深度优先遍历----递归
void DFS_digui(vector<vector<int>> &graph,vector<bool> &visited,int v)
{
	cout << v + 1 << "---->";
	visited[v] = true;
	for (int i = 0; i < graph.size(); i++)
	{
		if (graph[v][i] != 0 && visited[i] == false)
			DFS_digui(graph, visited, i);
	}
}

void BFS(vector<vector<int>> &graph, vector<bool> &visited, int v)
{
	queue<int> myqeue;
	myqeue.push(v);
	cout << v + 1 << "---->";
	visited[v] = true;
	while (!myqeue.empty())
	{
		int mark = myqeue.front();
		myqeue.pop();
		for (int i = 0; i < graph[mark].size(); i++)
		{
			if (graph[mark][i] != 0 && visited[i] == false)
			{
				cout << i + 1 << "---->";
				visited[i] = true;
				myqeue.push(i);
			}
		}
	}
}

int main()
{
	int n = 8;
	vector<vector<int>>  graph(n, vector<int> (n));
	vector<bool> visited(graph.size());
	for (int i = 0; i < visited.size(); i++)
	{
		visited[i] = false;
	}
	graph[0] = { 0, 1, 1, 0, 0, 0, 0, 0};
	graph[1] = { 1, 0, 0, 1, 1, 0, 0, 0 };
	graph[2] = { 1, 0, 0, 0, 0, 1, 1, 0 };
	graph[3] = { 0, 1, 0, 0, 0, 0, 0, 1 };
	graph[4] = { 0, 1, 0, 0, 0, 0, 0, 1 };
	graph[5] = { 0, 0, 1, 0, 0, 0, 1, 0 };
	graph[6] = { 0, 0, 1, 0, 0, 1, 0, 0 };
	graph[7] = { 0, 0, 0, 1, 1, 0, 0, 0 };
	show_graph(graph);
	cout << endl;
	DFS_digui(graph, visited, 0);
	cout << endl;
	for (int i = 0; i < visited.size(); i++)
	{
		visited[i] = false;
	}
	BFS(graph, visited, 0);
	system("pause");
	return 0;
}

  

时间: 2024-11-05 16:03:17

广度优先和深度优先搜索算法的相关文章

广度优先、深度优先搜索算法——面试题

广度优先搜索(Breadth-first Search) BFS在求解最短路径或者最短步数上有很多的应用.应用最多的是在走迷宫上. 分析 树的定义本身就是一种递归定义,因此对于树相关的算法题,递归是最好的解决思路(在递归深度允许的情况下). 递归版 public class Solution { public boolean isSymmetric(TreeNode root) { return root==null||isMirror(root.left,root.right); } priv

图基本算法 图搜索(广度优先、深度优先)

(边自学边写,还真有点累啊,) 注:以下代码均为部分,关于图的表示方法参看我的博客: http://www.cnblogs.com/dzkang2011/p/graph_1.html 一.广度优先搜索 广度优先搜索(BFS)是最简单的图搜索算法之一,也是很多重要的图算法的原型.在Prim最小生成树算法和Dijkstra单源最短路径算法中,都采用了与广度优先搜索类似的思想. 在给定图G=(V,E)和一个特定的源顶点s的情况下,广度优先搜索系统地探索G中的边,以期发现可以从s到达的所有顶点,并计算s

深度优先搜索算法的概念

深度优先搜索算法的概念 与广度优先搜索算法不同,深度优先搜索算法类似与树的先序遍历.这种搜索算法所遵循的搜索策略是尽可能"深"地搜索一个图.它的基本思想如下:首先访问图中某一个起始顶点v,然后由v出发,访问与v相邻且未被访问的任一顶点w1,再访问与w1邻接且未被访问的任一顶点w2,-.重复上述过程.当不能再继续向下访问时,依次退回到最近被访问的顶点,若它还有邻接顶点未被访问过,则从该点开始继续上述搜索过程,直到图中所有顶点均被访问过为止(还是举相同的例子,从你开始遍历你的所有亲戚,例如

图的深度优先搜索算法DFS

1.问题描述与理解 深度优先搜索(Depth First Search,DFS)所遵循的策略,如同其名称所云,是在图中尽可能"更深"地进行搜索.在深度优先搜索中,对最新发现的顶点v若此顶点尚有未探索过从其出发的边就探索之.当v的所有边都被探索过,搜索"回溯"到从其出发发现顶点v的顶点.此过程继续直至发现所有从源点可达的顶点.若图中还有未发现的顶点,则以其中之一为新的源点重复搜索,直至所有的顶点都被发现.与BFS中源顶点是指定的稍有不同. DFS搜索轨迹Gπ将形成一片

深度优先搜索算法(DFS)以及leetCode的subsets II

深度优先搜索算法(depth first search),是一个典型的图论算法.所遵循的搜索策略是尽可能“深”地去搜索一个图. 算法思想是: 对于新发现的顶点v,如果它有以点v为起点的未探测的边,则沿此边继续探测下去.当顶点v的所有边都已被探寻结束,则回溯到到达点v的先辈节点.以相同方法一直回溯到源节点为止.如果图中还有未被发现的顶点,则选择其中一个作为源顶点,重复以上的过程.最后的结果是一些不相交的深度优先树. leetCode中的应用: Given a collection of integ

深度优先搜索算法

一.深度优先搜索 深度优先搜索算法(Depth First Search),是图论中的经典算法. 深度优先搜索算法是沿着树的深度遍历树的节点,尽可能深的搜索树的分支.当结点所有子结点那一层都被搜索过,再回溯返回到当前结点的邻结点,继续搜索,直到遍历完整棵树.一般采用的是前序遍历,先根然后再左右结点的方式进行. 任何DFS只需要通过下面几步就可以实现,无论是递归还是非递归方式.我给这几步分别做了一个命名,分别是find.forward.done.back. 如下: 1.find(right):在树

广度/深度优先搜索算法 - python实现

1. 图 定义:图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合. 简单点的说:图由节点和边组成.一个节点可能与众多节点直接相连,这些节点被称为邻居. 如二叉树就为一个简单的图: 更加详细的信息可参见:https://www.cnblogs.com/polly333/p/4760275.html 2. 算法 1). 广度优先搜索: 广度优先搜索算法(Breadth First Search,BSF

图的邻接表表示、广度优先、深度优先搜索

图,就是我们在数据结构中学到的图,它是一种存储信息的结构.图是一类在实际应用中非常常见的数据结构,当数据规模大到一定程度时,如何对其进行高效计算即成为迫切需要解决的问题.最常见的大规模图数据的例子就是互联网网页数据,网页之间通过链接指向形成规模超过500 亿节点的巨型网页图.再如,Facebook 社交网络也是规模巨大的图,仅好友关系已经形成超过10 亿节点.千亿边的巨型图,考虑到Facebook 正在将所有的实体数据节点都构建成网状结构,其最终形成的巨型网络数据规模可以想见其规模.要处理如此规

Python中的广度优先和深度优先

Python中分为经典类和新式类: 经典类: class A(): pass 新式类: class A(object): pass 所以经典类和新式类的区别就是,在声明类的时候,新式类需要加上object关键字. Python中经典类和新式类的区别: 区别主要体现在继承上: Python的类可以继承多个类,Java和C#中则只能继承一个类 Python的类如果继承了多个类,那么其寻找方法的方式有两种 当类是经典类时,多继承情况下,会按照深度优先方式查找 当类是新式类时,多继承情况下,会按照广度优