OK

噢莫加纳加加加  •  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;
}

评论:

请先登录,才能进行评论