#include <iostream>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
const int size_z = 1 << 10;
int graph[size_z][size_z];
vector<int> dfs_records;
vector<int> bfs_records;
// 判断visited数组是否全为true
// 如果不全为true,则返回第一个为false的位置,否则返回-1
int all_true(const vector<bool> &visited) {
for(int i = 0, e = visited.size(); i < e; ++i)
if(!visited[i]) return i;
return -1;
}
// DFS
void dfs(int start, int vertex, vector<bool> &visited) {
visited[start] = true;
dfs_records.push_back(start);
for(int i = 0; i < vertex; ++i) {
if(!visited[i] && graph[start][i] == 1) {
dfs(i, vertex, visited);
}
}
}
void bfs(int start, int vertex, vector<bool> &visited) {
queue<int> q;
q.push(start);
visited[start] = true;
while(!q.empty()) {
auto node = q.front();
q.pop();
bfs_records.push_back(node);
for(int i = 0; i < vertex; ++i) {
if(!visited[i] && graph[node][i] == 1) {
visited[i] = true;
q.push(i);
}
}
}
}
void output_vector(const vector<int> & arr) {
int size = arr.size();
printf("{ ");
for(int i = 0; i < size; ++i) {
printf("%d ", arr[i]);
}
printf("}\n");
}
int main() {
int n, e, from, to;
cin >> n >> e;
memset(graph, 0, sizeof(graph));
while(e--) {
cin >> from >> to;
graph[from][to] = graph[to][from] = 1;
}
vector<bool>bfs_visited(n, false);
vector<bool>dfs_visited(n, false);
// 遍历
int start = 0;
do {
dfs_records.clear();
dfs(start, n, dfs_visited);
output_vector(dfs_records);
} while((start = all_true(dfs_visited)) != -1);
start = 0;
do {
bfs_records.clear();
bfs(start, n, bfs_visited);
output_vector(bfs_records);
} while((start = all_true(bfs_visited)) != -1);
return 0;
}
07-07
1496
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交