题解 P2951 【[USACO09OPEN]捉迷藏Hide and Seek】
曦行夜落
2018-04-30 15:06:16
实际上这题不需要这么麻烦:
对整个图进行广度优先遍历得出深度,其中深度最大的点就是最远的,然后我们找出有几个这样的点即可
贴代码:
------------
```cpp
#define maxn 20000+50
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<vector>
#include<queue>
using namespace std;
int n,m;
queue<int> q; //队列
vector<int> g[maxn]; //懒人vector存图
int step[maxn],vis[maxn]; //深度和标记
int main()
{
scanf("%d%d",&n,&m);
for (int i=1;i<=m;++i)
{
int u,v;
scanf("%d%d",&u,&v);
g[u].push_back(v);
g[v].push_back(u);
}
memset(step,-1,sizeof(step));
memset(vis,0,sizeof(vis));
step[1]=0;
q.push(1); vis[1]=1; //源点入队
while (!q.empty())
{
int u=q.front();
// printf("%d\n",u);
q.pop();
for (int i=0;i<g[u].size();++i)
{
int v=g[u][i];
if (!vis[v])
{
step[v]=step[u]+1;
q.push(v);
vis[v]=1;
}
}
}
/* for (int i=1;i<=n;++i)
printf("%d ",step[i]);
puts("");*/
int ans=0,ansp,ansnum=0;
for (int i=1;i<=n;++i)
if (ans<step[i])
{
ans=step[i];
ansp=i;
}
for (int i=1;i<=n;++i)
if (ans==step[i]) ansnum++;
printf("%d %d %d\n",ansp,ans,ansnum);
return 0;
}
```