SDUTACM 資料結構實驗圖論一:基於鄰接矩陣的廣度優先搜尋遍歷
阿新 • • 發佈:2019-02-17
題目描述
給定一個無向連通圖,頂點編號從0到n-1,用廣度優先搜尋(BFS)遍歷,輸出從某個頂點出發的遍歷序列。(同一個結點的同層鄰接點,節點編號小的優先遍歷)輸入
輸入第一行為整數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頂點的無向邊。
輸出
輸出有n行,對應n組輸出,每行為用空格隔開的k個整數,對應一組資料,表示BFS的遍歷結果。示例輸入
1 6 7 0 0 3 0 4 1 4 1 5 2 3 2 4 3 5
示例輸出
0 3 4 2 5 1
提示
#include<stdio.h> #include<stdlib.h> #include<string.h> int edge[110][110],vis[1000],n,e;//n為頂點數,e為邊數 void BFS(int s) { int queue[1000],out=0,in=0,w,i; //訪問第一個頂點並標記已訪問 vis[s]=1; printf("%d",s); //已訪問的頂點入隊 queue[in++]=s; while(out<in) { //已訪問的頂點出隊 w=queue[out++]; //遍歷每一個頂點 for(i=0;i<n;i++) { //若該頂點未訪問且和出隊頂點有聯絡則訪問之、標記之和入隊 if(vis[i]==0&&edge[w][i]==1) { vis[i]=1; printf(" %d",i); queue[in++]=i; } } } } int main() { int T,t,i,s,x,y; scanf("%d",&T); for(t=0;t<T;t++) { //初始化edge、vis陣列 memset(edge,0,sizeof(edge)); memset(vis,0,sizeof(vis)); //輸入頂點數、邊數和訪問起始點 scanf("%d%d%d",&n,&e,&s); //輸入相連線的邊,建立圖 for(i=0;i<e;i++) { scanf("%d%d",&x,&y); edge[x][y]=1; edge[y][x]=1; } //呼叫廣度優先搜尋 BFS(s); printf("\n"); } return 0; }