中国大学MOOC-陈越、何钦铭-数据结构-2018秋——列出连通集

版权声明:我的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++解题报告:

猜你喜欢

转载自blog.csdn.net/qq_41231926/article/details/84674927