噢莫加纳加加加 • 1个月前
#include <bits/stdc++.h>
#include <queue>
using namespace std;
vector<int>mymap[1005];//存邻接表
bool vis[1005];//用vis数组标记节点是否被访问过
void bfs(int start) {
queue<int>q1;//创建一个队列q1 存储接下来访问的节点
q1.push(start);//开始结点加入队列q1
vis[start] = true; //并且标记为已访问
while (!q1.empty()) { //队列判空 不空 继续访问
int f = q1.front(); //取出队头元素并访问
q1.pop();
cout << f << " ";
for (int next : mymap[f]) { //遍历与当前节点相邻的节点
if (!vis[next]) { //相邻节点是否被访问过,没访问过
vis[next] = true; //标记相邻节点已访问过
q1.push(next);//入队1
}
}
}
}
int main() {
int n;
cin >> n;
while (n--) {
int k, m, t;
cin >> k >> m >> t; //顶点 边 起始点
memset(vis, 0, sizeof(vis));
for (int i = 0; i < k; i++) {
mymap[i].clear();//清空矩阵
}
for (int i = 0; i < m; i++) {
int j, k;
cin >> j >> k;
mymap[j].push_back(k);
mymap[k].push_back(j); //邻接表存图
}
for (int i = 0; i < k; i++) {
sort(mymap[i].begin(), mymap[i].end()); //每个节点邻接表进行排序
}
bfs(t);//开始广搜
for (int i = 0; i < k; i++) {
if (!vis[i]) { //看节点是否被访问过,没被访问过,那就从当前节点广搜
bfs(i);
}
}
cout << endl;
}
return 0;
}
评论:
请先登录,才能进行评论