1. 程式人生 > >演算法7-4,7-5:圖的遍歷——深度優先搜尋(c語言)

演算法7-4,7-5:圖的遍歷——深度優先搜尋(c語言)

[提交] [統計] [提問]

題目描述

深度優先搜尋遍歷類似於樹的先根遍歷,是樹的先根遍歷的推廣。其過程為:假設初始狀態是圖中所有頂點未曾被訪問,則深度優先搜尋可以從圖中的某個頂點v出發,訪問此頂點,然後依次從v的未被訪問的鄰接點出發深度優先遍歷圖,直至圖中所有和v有路徑相通的頂點都被訪問到;若此時圖中尚有頂點未被訪問,則另選圖中一個未曾被訪問的頂點作為起始點,重複上述過程,直至圖中所有頂點都被訪問到為止。

其演算法可以描述如下:

在本題中,讀入一個無向圖的鄰接矩陣(即陣列表示),建立無向圖並按照以上描述中的演算法遍歷所有頂點,輸出遍歷頂點的順序。

輸入描述

輸入的第一行包含一個正整數n,表示圖中共有n個頂點。其中n不超過50。

以後的n行中每行有n個用空格隔開的整數0或1,對於第i行的第j個0或1,1表示第i個頂點和第j個頂點有直接連線,0表示沒有直接連線。當i和j相等的時候,保證對應的整數為0。

輸入保證鄰接矩陣為對稱矩陣,即輸入的圖一定是無向圖。

輸出描述

只有一行,包含n個整數,表示按照題目描述中的深度優先遍歷演算法遍歷整個圖的訪問頂點順序。每個整數後輸出一個空格,並請注意行尾輸出換行。

輸入樣例
4
0 1 0 1
1 0 0 0
0 0 0 1
1 0 1 0

輸出樣例
0 1 3 2

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int n, k;
int a[55][55];
int b[55];
int ans[55];

void DFS(int x)
{
    int i, j;

    ans[k] = x; //將訪問過的結點記錄下來
    ++k;
    b[x] = 0;
    if(k == n)
    {
        for(i = 0; i < n; i++)
        {

            printf("%d ", ans[i]);
        }
        printf("\n");
        exit(0); //直接跳出終止程式
    }
    for(j = 0; j < n; j++)
    {

        if(a[x][j] == 1 && b[j] == 1) //發現未訪問的結點就繼續訪問下去
        {
            DFS(j);
        }
    }
    return ;
}

int main()
{
    int i, j;
    scanf("%d", &n);
    {
        for(i = 0; i < n; i++)
        {
            for(j = 0; j < n; j++)
            {
                scanf("%d", &a[i][j]);

            }
        }
        k = 0;
        for(j = 0; j < n; j++) //將所有結點都初始化為未訪問過的點,1代表未訪問,0代表已經訪問
            b[j] = 1;
        for(i = 0; i < n; i++) //依次檢視結點是否被訪問過
        {
            if(b[i] == 1)
               DFS(i);
        }

    }
    return 0;
}