版权声明:我的GitHub:https://github.com/617076674。真诚求星! https://blog.csdn.net/qq_41231926/article/details/84674927
我的中国大学MOOC-陈越、何钦铭-数据结构-2018秋代码仓:https://github.com/617076674/MOOC-DataStructure-2018-Autumn
题目描述:
知识点:图的深度优先遍历、图的广度优先遍历
思路:图的深度优先遍历 + 图的广度优先遍历
由于题目假设我们从编号最小的顶点出发,按编号递增的顺序访问邻接点,因此我们需要对每个顶点的邻接点先进行从小到大排序。
时间复杂度和每个顶点的邻接点数量有关。空间复杂度是O(N + E)。
C++代码:
#include<iostream>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
int N, E;
vector<int> graph[10], oneTimeTravel;
bool visited[10];
void dfs(int nowVisit);
void bfs(int nowVisit);
int main() {
scanf("%d %d", &N, &E);
int v1, v2;
for(int i = 0; i < E; i++) {
scanf("%d %d", &v1, &v2);
graph[v1].push_back(v2);
graph[v2].push_back(v1);
}
for(int i = 0; i < N; i++){
sort(graph[i].begin(), graph[i].end());
}
fill(visited, visited + N, false);
for(int i = 0; i < N; i++) {
if(!visited[i]) {
oneTimeTravel.clear();
dfs(i);
printf("{ ");
for(int i = 0; i < oneTimeTravel.size(); i++) {
printf("%d ", oneTimeTravel[i]);
}
printf("}\n");
}
}
fill(visited, visited + N, false);
for(int i = 0; i < N; i++) {
if(!visited[i]) {
oneTimeTravel.clear();
bfs(i);
printf("{ ");
for(int i = 0; i < oneTimeTravel.size(); i++) {
printf("%d ", oneTimeTravel[i]);
}
printf("}\n");
}
}
}
void dfs(int nowVisit){
visited[nowVisit] = true;
oneTimeTravel.push_back(nowVisit);
for(int i = 0; i < graph[nowVisit].size(); i++){
int v = graph[nowVisit][i];
if(!visited[v]){
dfs(v);
}
}
}
void bfs(int nowVisit){
queue<int> q;
q.push(nowVisit);
visited[nowVisit] = true;
while(!q.empty()){
int u = q.front();
oneTimeTravel.push_back(u);
q.pop();
for(int i = 0; i < graph[u].size(); i++){
int v = graph[u][i];
if(!visited[v]){
q.push(v);
visited[v] = true;
}
}
}
}
C++解题报告: