#include<iostream>
#include<queue>
using namespace std;
const int N = 1e2 + 10;
//n个顶点,m条边
int n, m;
//邻接矩阵
int g[N][N];
//标记数组
bool vis[N];//vis[2]=1/0 代表2号点 1-被标记 0-没被标记
void bfs(int s/*搜索的起点*/) {
queue<int>q;
q.push(s);
vis[s] = 1;
while (!q.empty()) {
int v = q.front();
q.pop();
cout << v << " ";
for (int i = 1; i <= n; i++) {
if (!vis[i] && g[v][i] == 1) {
q.push(i);
vis[i] = 1;
}
}
}
}
int main() {
cin >> n >> m;
for (int i = 1; i <= m; i++) {
int u, v; cin >> u >> v;
g[u][v] = g[v][u] = 1;
}
int s; cin >> s;
bfs(s);//从起点s开始深搜
return 0;
}
邻接表
#include<iostream>
#include<queue>
#include<vector>
using namespace std;
const int N = 1e4 + 10;
vector<int> g[N];//邻接表存图
bool vis[N];//标记数组-防止重复搜索
int n, m, s;//n-点数 m-边数 s-搜索起点
void bfs(int start/*搜索的起点*/) {
queue<int> q;
//1.起点入队+标记
q.push(start); vis[start] = 1;
while (!q.empty()) {
//2.搜索队首元素,并弹出队列
int v = q.front(); q.pop();
cout << v << " ";
//3.找到v点所有邻接点,入队+标记
for (auto u: g[v]) {
if (!vis[u]) {//u是v的邻接点且u没有被搜索过
q.push(u); vis[u] = 1;
}
}
}
}
int main() {
cin >> n >> m;
for (int i = 1; i <= m; i++) {
int u, v; cin >> u >> v;
g[u].push_back(v); g[v].push_back(u);
}
cin >> s;
bfs(s);//从起点s开始搜索
return 0;
}