1. 程式人生 > 其它 >7-7 列出連通集

7-7 列出連通集

給定一個有N個頂點和E條邊的無向圖,請用DFS和BFS分別列出其所有的連通集。假設頂點從0到N1編號。進行搜尋時,假設我們總是從編號最小的頂點出發,

按編號遞增的順序訪問鄰接點。

輸入格式:

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

輸出格式:

按照"{v1v2...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 }
思路:
1.首先確認圖的儲存方式,由於N(0<N10),需要的記憶體較少,採用鄰接矩陣的方式來儲存圖
2.DFS需要使用遞迴遍歷,而BFS需要使用佇列,在這裡使用陣列模擬佇列
3.沒有邊的頂點單獨輸出

程式碼:

void dfs(int i,int Nv)
{
    cout<<i<<" ";
    visited[i]=1;//將訪問過的頂點沉默
    for(int j=0;j<Nv;j++)
    {
        if(visited[j]==0&&a[i][j]==1)//如果頂點j沒有被訪問過且i和j之間有邊 
        {
            dfs(j,Nv);//進行遞迴
        }
    }
}
void dfstraversal(int
Nv) { for(int i=0;i<Nv;i++) { visited[i]=0;//初始化為0 } for(int i=0;i<Nv;i++) {
//這裡的程式碼是因為需要分開輸出聯通塊,進行一次for迴圈,仔細理解一下
//dfs的特性就是每次都可以將一個連通塊全部走完
if(!visited[i])//如果沒有被訪問過 {
   cout
<<"{ "; dfs(i,Nv); cout<<"}"<<endl; } } }


void bfs(int nv)
{
    int l=0,r=0;
    int queue[1000];//用陣列模擬佇列,l為隊頭,r為隊尾
    for(int i=0;i<nv;i++)
    {
        visited[i]=0;
    }
    for(int i=0;i<nv;i++)
    {
        if(!visited[i])
        {
            cout<<"{ ";
            queue[r++]=i;
            visited[i]=1;
            while(l!=r)//當佇列不為空時
            {
                int tmp=queue[l++];
                cout<<tmp<<" ";
                for(int j=0;j<nv;j++)
                {
                    if(a[tmp][j]&&!visited[j])
                    {
                        visited[j]=1;
                        queue[r++]=j;
                    }
                }
            }
            cout<<"}"<<endl;
        }
    }
}
解釋一下:
剛開始l和r都指向下標為0的地方,先將元素0入隊,r++,來到下標為1的地方,然後用tmp將0取出,l++,並用一層for迴圈尋找出所有與0連線的元素,全部入隊
for迴圈結束後,回到while迴圈,直到將第一個聯通塊輸出完。




完整程式碼:
#include<iostream> using namespace std; #define max 10 int visited[max]; int a[max][max]; void dfs(int i,int Nv) { cout<<i<<" "; visited[i]=1; for(int j=0;j<Nv;j++) { if(visited[j]==0&&a[i][j]==1) { dfs(j,Nv); } } } void dfstraversal(int Nv) { for(int i=0;i<Nv;i++) { visited[i]=0; } for(int i=0;i<Nv;i++) { if(!visited[i]) { cout<<"{ "; dfs(i,Nv); cout<<"}"<<endl; } } } void bfs(int nv) { int l=0,r=0; int queue[1000]; for(int i=0;i<nv;i++) { visited[i]=0; } for(int i=0;i<nv;i++) { if(!visited[i]) { cout<<"{ "; queue[r++]=i; visited[i]=1; while(l!=r) { int tmp=queue[l++]; cout<<tmp<<" "; for(int j=0;j<nv;j++) { if(a[tmp][j]&&!visited[j]) { visited[j]=1; queue[r++]=j; } } } cout<<"}"<<endl; } } } int main() { int N,E; cin>>N>>E; int v1,v2; for(int i=0;i<E;i++) { cin>>v1>>v2; a[v1][v2]=a[v2][v1]=1; } dfstraversal(N); bfs(N); return 0; }