数据结构实验之图论二:基于邻接表的广度优先搜索遍历
题目描述
给定一个无向连通图,顶点编号从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顶点的无向边。
对于每组数据,第一行是三个整数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
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<queue> 2 #include<vector> 3 #include<stdio.h> 4 #include<string.h> 5 using namespace std; 6 priority_queue<int, vector<int>, greater<int> >head[100]; 7 queue<int>q; 8 bool vis[110]; 9 int flag; 10 void bfs() 11 { 12 while(!q.empty()) 13 { 14 int cur = q.front(); 15 q.pop(); 16 if(flag == 0) 17 { 18 printf("%d",cur); 19 flag = 1; 20 } 21 else printf(" %d",cur); 22 while(!head[cur].empty()) 23 { 24 int tmp = head[cur].top(); 25 if(!vis[tmp]) 26 { 27 q.push(tmp); 28 vis[tmp] = 1; 29 } 30 head[cur].pop(); 31 } 32 } 33 printf("\n"); 34 } 35 36 int main() 37 { 38 int t, n, m, k, u, v; 39 scanf("%d", &t); 40 while(t--) 41 { 42 scanf("%d %d %d", &n, &m, &k); 43 memset(vis, 0, sizeof(vis)); 44 for(int i = 0; i < n; i++) 45 while(!head[i].empty()) 46 head[i].pop(); 47 while(m--) 48 { 49 scanf("%d %d", &u, &v); 50 head[u].push(v); 51 head[v].push(u); 52 } 53 while(!q.empty())q.pop(); 54 q.push(k); 55 vis[k] = 1; 56 flag = 0; 57 bfs(); 58 } 59 return 0; 60 }