问题_PRO_10_1
搜索图的方法存在多种,深度优先探索(DFS;Depth First Search)和广度优先搜索(BFS; Breadth First Search)是代表性的搜发方法,请编写深度优先搜索和广度优先搜索的程序。
此问题中所谓的广度优先搜索可以认为是使用cue,以一次只搜索一个点的方式进行。并且给定的图是包含起点的一个连接图(connected graph)。
输入
第一行给出图的点的个数为V,干线的个数是E,起点的编号是S并且用空白隔开。(1 ≤ S ≤ V ≤ 20,000, 1 ≤ E ≤ 100,000)
从第二行开始经过E条线后,给出各线段的信息x,y并用空格隔开。此处就表示存在连接x和y的线(1 ≤ x, y ≤ V, x ≠ y)
输出
在第一行按升序输出从顶点S开始的深度优先搜索的结果中最快的方法。
在第二行按升序输出从顶点S开始的广度优先搜索的结果中最快的方法
案例输入1
5 6 2
1 2
1 3
2 4
3 4
3 5
4 5
案例输出1
2 1 3 4 5
2 1 4 3 5
案例输入2
5 4 1
1 2
1 3
2 5
3 4
案例输出2
1 2 5 3 4
1 2 3 5 4
#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
int V, E, S;
vector<int> edges[20003];
vector<bool> visit;
void dfs(int now) {
if (visit[now]) {
return;
}
visit[now] = true;
printf("%d ", now);
for (auto &v : edges[now]) {
dfs(v);
}
}
void bfs() {
queue<int> que;
que.push(S);
visit[S] = true;
while (!que.empty()) {
int now = que.front();
que.pop();
printf("%d ", now);
for (auto &v : edges[now]) {
if (visit[v]) {
continue;
}
visit[v] = true;
que.push(v);
}
}
printf("\n");
}
int main() {
scanf("%d %d %d", &V, &E, &S);
for (int i = 0; i < E; i ++) {
int x, y;
scanf("%d %d", &x, &y);
edges[x].push_back(y);
edges[y].push_back(x);
}
for (int i = 1; i <= V; i ++) {
sort(edges[i].begin(), edges[i].end());
}
visit.resize(V + 1, false);
dfs(S);
printf("\n");
fill(visit.begin(), visit.end(), false);
bfs();
return 0;
}