C++笔记-基于邻接表的BFS(宽度优先遍历)

这里是基于邻接表的,有向的,具体代码如下:

#include <iostream>
#include <list>
 
using namespace std;
 
 
class Graph
{
	int V;
 
 
	list<int> *adj;
public:
	Graph(int V);
 
 
	void addEdge(int v, int w);
 
 
	void BFS(int s);
};
 
Graph::Graph(int V)
{
	this->V = V;
	adj = new list<int>[V];
}
 
void Graph::addEdge(int v, int w)
{
	adj[v].push_back(w);
}
 
void Graph::BFS(int s)
{
 
	bool *visited = new bool[V];
	for (int i = 0; i < V; i++)
		visited[i] = false;
 
 
	list<int> queue;
 
 
	visited[s] = true;
	queue.push_back(s);
 
 
	list<int>::iterator i;
 
	while (!queue.empty())
	{
 
		s = queue.front();
		cout << s << " ";
		queue.pop_front();
 
 
		for (i = adj[s].begin(); i != adj[s].end(); ++i)
		{
			if (!visited[*i])
			{
				visited[*i] = true;
				queue.push_back(*i);
			}
		}
	}
}
 
 
int main()
{
 
	Graph g(4);
	g.addEdge(0, 1);
	g.addEdge(1, 2);
	g.addEdge(0, 3);
	
	cout << "Following is Breadth First Traversal " << endl;
	g.BFS(0);
 
	getchar();
	return 0;
}

程序运行截图如下:

这里的g.BFS(0);代表,从0这个顶点开始。

邻接表是这样的:

 

 

邻接表是一种表示图的数据结构,深度优先遍历是一种遍历图的算法。下面是C++实现基于邻接表的深度优先遍历的示例代码: ```c++ #include<iostream> #include<cstring> #include<vector> using namespace std; const int maxn = 100; vector<int> G[maxn]; //邻接表存储图 bool vis[maxn]; //标记每个节点是否被访问过 void dfs(int u) //从节点u开始深度优先遍历 { vis[u] = true; //标记节点u已被访问 cout << u << " "; //输出节点u for (int i = 0; i < G[u].size(); i++) //遍历节点u的所有邻接节点 { int v = G[u][i]; if (!vis[v]) //如果节点v未被访问 { dfs(v); //递归访问节点v } } } int main() { int n, m; cin >> n >> m; //输入节点数n和边数m memset(vis, false, sizeof(vis)); //初始化所有节点均未被访问 for (int i = 0; i < m; i++) { int u, v; cin >> u >> v; //输入边的起点和终点 G[u].push_back(v); //将边加入邻接表 G[v].push_back(u); //无向图需添加反向边 } for (int i = 1; i <= n; i++) //枚举所有节点 { if (!vis[i]) //如果节点i未被访问 { dfs(i); //从节点i开始深度优先遍历 } } return 0; } ``` 在这个示例代码中,我们使用邻接表存储图,其中`G[u]`表示节点u的邻接表,即与节点u有直接边相连的所有节点。然后我们使用`dfs`函数进行深度优先遍历,从节点u开始遍历,首先标记节点u已访问,然后输出节点u,接着遍历节点u的所有邻接节点,如果某个邻接节点v未被访问,那么递归访问节点v。最后,我们枚举所有节点,如果某个节点未被访问,那么从该节点开始进行深度优先遍历
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值