MOOC浙大資料結構 — 06-圖1 列出連通集 (25分)
阿新 • • 發佈:2019-01-31
給定一個有N個頂點和E條邊的無向圖,請用DFS和BFS分別列出其所有的連通集。假設頂點從0到N−1編號。進行搜尋時,假設我們總是從編號最小的頂點出發,按編號遞增的順序訪問鄰接點。
輸入格式:
輸入第1行給出2個整數N(0<N≤10)和E,分別是圖的頂點數和邊數。隨後E行,每行給出一條邊的兩個端點。每行中的數字之間用1空格分隔。
輸出格式:
按照"{ v1 v2 ... vk }"的格式,每行輸出一個連通集。先輸出DFS的結果,再輸出BFS的結果。
輸入樣例:
8 6 0 7 0 1 2 0 4 1 2 4 3 5
輸出樣例:
{ 0 1 4 2 7 }
{ 3 5 }
{ 6 }
{ 0 1 2 7 4 }
{ 3 5 }
{ 6 }
#include <cstdio> #include <vector> #include <queue> #include <algorithm> #define MAX 10 using namespace std; typedef struct { int vId; // 相連線的結點編號 int edge; // 邊權 } Node; vector<int> MGraph[MAX]; int visit[MAX]; void dfs( int curNode ) { printf( " %d", curNode ); for( int i = 0; i < MGraph[curNode].size(); i++ ) { int nextId = MGraph[curNode][i]; if( !visit[nextId] ) { visit[nextId] = 1; dfs( nextId ); } } } void bfs( int curNode, int n ) { queue<int> q; q.push( curNode ); while( !q.empty() ) { int curId = q.front(); q.pop(); printf( " %d", curId ); for( int i = 0; i < MGraph[curId].size(); i++ ) { int nextId = MGraph[curId][i]; if( !visit[nextId] ) { q.push( nextId ); visit[nextId] = 1; } } } } int main() { int N, M; scanf( "%d%d", &N, &M ); int a, b; for( int i = 0; i < M; i++ ) { scanf( "%d%d", &a, &b ); MGraph[a].push_back( b ); MGraph[b].push_back( a ); } for( int i = 0; i < N; i++ ) { if( MGraph[i].size() > 1 ) sort( MGraph[i].begin(), MGraph[i].end() ); } for( int i = 0; i < N; i++ ) { if( !visit[i] ) { visit[i] = 1; printf( "{" ); dfs( i ); printf( " }\n" ); } } fill( visit, visit + N, 0 ); for( int i = 0; i < N; i++ ) { if( !visit[i] ) { visit[i] = 1; printf( "{" ); bfs( i, N ); printf( " }\n" ); } } return 0; }