1. 程式人生 > >MOOC浙大資料結構 — 06-圖1 列出連通集 (25分)

MOOC浙大資料結構 — 06-圖1 列出連通集 (25分)

給定一個有NN個頂點和EE條邊的無向圖,請用DFS和BFS分別列出其所有的連通集。假設頂點從0到N-1N1編號。進行搜尋時,假設我們總是從編號最小的頂點出發,按編號遞增的順序訪問鄰接點。

輸入格式:

輸入第1行給出2個整數NN(0<N\le 100<N10)和EE,分別是圖的頂點數和邊數。隨後EE行,每行給出一條邊的兩個端點。每行中的數字之間用1空格分隔。

輸出格式:

按照"{ v_1v1 v_2v2 ... v_kvk }"的格式,每行輸出一個連通集。先輸出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;
}