1. 程式人生 > >SDUT 2141 資料結構實驗之圖論一:基於鄰接矩陣的廣度優先搜尋遍歷

SDUT 2141 資料結構實驗之圖論一:基於鄰接矩陣的廣度優先搜尋遍歷

資料結構實驗之圖論一:基於鄰接矩陣的廣度優先搜尋遍歷

Time Limit: 1000MS Memory Limit: 65536KB

Problem Description

給定一個無向連通圖,頂點編號從0到n-1,用廣度優先搜尋(BFS)遍歷,輸出從某個頂點出發的遍歷序列。(同一個結點的同層鄰接點,節點編號小的優先遍歷)

Input

輸入第一行為整數n(0< n <100),表示資料的組數。
對於每組資料,第一行是三個整數k,m,t(0<k<100,0<m<(k-1)*k/2,0< t<k),表示有m條邊,k個頂點,t為遍歷的起始頂點。
下面的m行,每行是空格隔開的兩個整數u,v,表示一條連線u,v頂點的無向邊。

Output

輸出有n行,對應n組輸出,每行為用空格隔開的k個整數,對應一組資料,表示BFS的遍歷結果。

Example Input

1
6 7 0
0 3
0 4
1 4
1 5
2 3
2 4
3 5

Example Output

0 3 4 2 5 1

Hint

以鄰接矩陣作為儲存結構。

BFS(廣度優先搜尋):遍歷節點,首先給定一個頭結點,然後放入佇列內,當向下尋找與之相連的節點時,出佇列,將尋找到的第二層節點依次放入佇列內;等以第二層節點為頭開始尋找下一層節點時,第二層的節點按照先後順序依次出佇列,再將其下一層節點剛入佇列內,依次直到全部遍歷完成。

#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
int map[500][500],vis[500],ans[500];
//map為鄰接矩陣,存圖;VIS標記節點是否被訪問;
//ans儲存遍歷結果
int num;
void BFS(int t,int m)
{
    queue <int> Q;
    vis[t]=1;
    ans[num++]=t;
    Q.push(t);
    while(!Q.empty())
    {
        int q=Q.front();
        Q.pop();
        for(int i=0;i<m;i++)
        {
            if(!vis[i]&&map[q][i])
            {
                vis[i]=1;
                ans[num++]=i;
                Q.push(i);
            }
        }
    }
}
int main()
{
    int n,m,k,t;
    int x,y;
    scanf("%d",&n);
    while(n--)
    {
        scanf("%d %d %d",&m,&k,&t);
        memset(map,0,sizeof(map));
        memset(vis,0,sizeof(vis));
        for(int i=0;i<k;i++)
        {
            scanf("%d %d",&x,&y);
            map[x][y]=map[y][x]=1;
        }
        num=0;
        BFS(t,m);
        for(int i=0;i<num;i++)
        {
            if(i==num-1)
                printf("%d\n",ans[i]);
            else
                printf("%d ",ans[i]);
        }
    }
    return 0;
}