c++广搜深搜
·
广度优先搜索(BFS)是一种基于队列实现的搜索算法,其主要思想是从起点开始向周围扩展,先遍历所有与起点相邻的节点,再遍历与这些节点相邻的节点,以此类推,直到找到终点或者搜索全部节点为止。每次遍历到一个节点时,将该节点加入队列中,直到队列为空为止。
以下是一个基本的C++实现:
#include <iostream>
#include <queue>
using namespace std;
const int N = 100010;
int n, m;
int g[N][N]; // 存储图
bool st[N]; // 存储每个节点是否遍历过
int dist[N]; // 存储起点到每个节点的距离
void bfs(int start)
{
queue<int> q;
q.push(start);
st[start] = true;
dist[start] = 0;
while (!q.empty())
{
int t = q.front();
q.pop();
// 遍历与当前节点相邻的节点
for (int i = 1; i <= n; i ++)
{
if (g[t][i] && !st[i])
{
q.push(i);
st[i] = true;
dist[i] = dist[t] + 1;
}
}
}
}
int main()
{
scanf("%d%d", &n, &m);
// 构建图
for (int i = 0; i < m; i ++)
{
int a, b;
scanf("%d%d", &a, &b);
g[a][b] = 1;
g[b][a] = 1; // 如果是有向图,这行可以省略
}
bfs(1);
// 输出起点到每个节点的距离
for (int i = 1; i <= n; i ++)
printf("%d ", dist[i]);
return 0;
}
深度优先搜索(DFS)是另一种常见的搜索算法,其主要思想是从起点开始一直向下搜索,直到找到终点或者无法继续搜索为止。与BFS不同的是,DFS是通过递归实现的。具体实现方法是从起点开始,遍历与当前节点相邻的节点,如果该节点未被访问过,则递归进入该节点,继续搜索;如果该节点已经被访问过,则回溯到上一个节点继续搜索,直到遍历完整张图为止。
以下是一个基本的C++实现:
#include <iostream>
using namespace std;
const int N = 100010;
int n, m;
int g[N][N]; // 存储图
bool st[N]; // 存储每个节点是否遍历过
void dfs(int u)
{
st[u] = true;
// 遍历与当前节点相邻的节点
for (int i = 1; i <= n; i ++)
{
if (g[u][i] && !st[i])
dfs(i);
}
}
int main()
{
scanf("%d%d", &n, &m);
// 构建图
for (int i = 0; i < m; i ++)
{
int a, b;
scanf("%d%d", &a, &b);
g[a][b] = 1;
g[b][a] = 1; // 如果是有向图,这行可以省略
}
dfs(1);
// 输出遍历过的节点
for (int i = 1; i <= n; i ++)
{
if (st[i])
printf("%d ", i);
}
return 0;
}
更多推荐


所有评论(0)