1. 程式人生 > >中國大學MOOC-陳越、何欽銘-資料結構-2018秋——列出連通集

中國大學MOOC-陳越、何欽銘-資料結構-2018秋——列出連通集

我的中國大學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++解題報告: