中國大學MOOC-陳越、何欽銘-資料結構-2018秋——列出連通集
阿新 • • 發佈:2018-12-05
我的中國大學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++解題報告: