捉迷藏(BFS)
题目描述
Anna正在和一群朋友在玩捉迷藏游戏。这种游戏由若干人一起玩,其中一个人为“鬼”,其他人藏在N个房间,由鬼来找这些人。Anna想计算出N(2 <= N <= 20,000)个房间(编号为1……N)中她应该藏哪一间?
Anna知道“鬼”会从房间1开始找。所有房间被M条双向路连接M (1<= M <= 50,000),这种双向路以(A_i,B_i)表示,其中1<=A_i<=N;1<=B_i<=N; A_i!=B_i。通过这些双向路,任意两个房间之间都可以到达。
Anna觉得离房间1最远的那个房间最安全(相邻两个房间之间的距离为1),请你帮Anna编写一个程序找出她应该躲在哪个房间。
输入
第一行为N和M;第2行至第M+1行,分别包含一条路(A_i,B_i)。
输出
仅有一行,包含三个整数I、J、K,分别表示Anna应该躲的房间号(如果有多解,输出编号最小的)、房间1到Anna躲的房间的距离、Anna可以躲的房间数目。
样例输入
6 7
3 6
4 3
3 2
1 3
1 2
2 4
5 2
样例输出
4 2 3
提示
房间4,5,6 均离起点的距离为2,我们选择4号房间。
1.读入输入:读取房间数n和路径数m,然后读入m条路径,每条路径连接两个房间。
2.构建图:使用邻接表表示图(无向图),每个房间的邻居列表存储在vector<vector<int>>中。
3.BFS计算最短距离:
初始化距离数组dist,大小为n+1(1-based indexing),初始值设为-1表示未访问。
从房间1开始BFS:设置dist[1]=0,将房间1加入队列。
遍历队列:对于每个出队房间u,访问其所有邻居v;如果v未访问(dist[v]==-1),则设置dist[v]=dist[u]+1,并将v加入队列。
4.分析距离数组:
遍历所有房间(1到N),找到最大距离max_dist。
同时统计具有max_dist的房间数量count,并记录其中房间编号最小的min_room。
5.输出结果:输出min_room(Anna应藏的房间)、max_dist(距离)和count(房间数量)。
代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n,m,u,v;
int main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);cin>>n>>m;vector<vector<int>>graph(n+1);for(int i=0;i<m;i++){cin>>u>>v;graph[u].push_back(v);graph[v].push_back(u);}vector<int>dist(n+1,-1);dist[1]=0;queue<int>q;q.push(1);while(!q.empty()){u=q.front();q.pop();for(int v:graph[u]){if(dist[v]==-1){dist[v]=1+dist[u];q.push(v);}}}int min_room=-1,max_dist=-1,count=0;for(int i=1;i<=n;i++){if(dist[i]>max_dist){max_dist=dist[i];min_room=i;count=1;}else if(dist[i]==max_dist){count++;}}cout<<min_room<<" "<<max_dist<<" "<<count;return 0;
}