时间限制:1秒 内存限制:32M
题目描述
广度优先搜索遍历类似于树的按层次遍历的过程。其过程为:假设从图中的某顶点0出发,在访问了0之后依次从小到大访问各个未曾被访问过的邻接点,然后分别从这些邻接点出发依次访问它们的邻接点,并使“先被访问的顶点的邻接点”先于“后被访问的顶点的邻接点”被访问,读入一个无向图的邻接矩阵(即数组表示),建立无向图并按照以上描述中的算,输出遍历顶点的顺序。
注意:如果遍历一轮后没法再到达其他点,则程序结束。
输入描述
输入的第一行包含一个正整数n,表示图中共有n个顶点。其中n不超过50。
以后的n行中每行有n个用空格隔开的整数0或1,对于第i行的第j个0或1,1表示第i个顶点和第j个顶点有直接连接,0表示没有直接连接。当i和j相等的时候,保证对应的整数为0。
输入保证邻接矩阵为对称矩阵,即输入的图一定是无向图。
输出描述
只有一行,包含n个整数,表示按照题目描述中的广度优先遍历算法遍历整个图的访问顶点顺序。每个整数后输出一个空格
样例
输入
4 0 0 0 1 0 0 1 1 0 1 0 1 1 1 1 0
输出
0 3 1 2
#include<cmath>
#include<cstdio>
#include<queue>
#include<string>
#include<cstring>
#include<iomanip>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=100;
int a[N][N],vis[N],q[N],f,r;
int n;
void bfs(int x) {
vis[x]=1;//起点标记入队
q[r++]=x;
while(f<r) {
int t=q[f];
cout<<t<<" ";
for(int i=0; i<n; i++) {
if(a[t][i]&&!vis[i]) {
vis[i]=1;
q[r++]=i;
}
}
f++;
}
}
int main() {
cin>>n;
for(int i=0; i<n; i++) {
for(int j=0; j<n; j++) {
cin>>a[i][j];
}
}
bfs(0);
return 0;
}
C++代码展示了如何利用广度优先搜索算法处理无向图的遍历问题,通过邻接矩阵输入,输出按照层次顺序的顶点序列

3万+

被折叠的 条评论
为什么被折叠?



