SDUT 2141 資料結構實驗之圖論一:基於鄰接矩陣的廣度優先搜尋遍歷
阿新 • • 發佈:2019-01-27
資料結構實驗之圖論一:基於鄰接矩陣的廣度優先搜尋遍歷
Time Limit: 1000MS Memory Limit: 65536KBProblem 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; }