BZOJ3402: [Usaco2009 Open]Hide and Seek 捉迷藏

易水人去,明月如霜。

Description

    贝茜在和约翰玩一个“捉迷藏”的游戏.
    她正要找出所有适合她躲藏的安全牛棚.一共有N(2≤N≤20000)个牛棚,被编为1到N号.她知道约翰(捉牛者)从牛棚1出发.所有的牛棚由M(1≤M≤50000)条双向路连接,每条双向路连接两个不同的牛棚.所有的牛棚都是相通的.贝茜认为同牛棚1距离最远的的牛棚是安全的.两个牛棚间的距离是指,从一个牛棚到另一个牛棚最少需要通过的道路数量.请帮贝茜找出所有的安全牛棚.

Input

    第1行输入两个整数N和M,之后M行每行输入两个整数,表示一条路的两个端点.
   

Output

 仅一行,输出三个整数.第1个表示安全牛棚(如果有多个,输出编号最小的);第2个表示牛棚1和安全牛棚的距离;第3个表示有多少个安全的牛棚.

Sample Input

6 7
3 6
4 3
3 2
1 3
1 2
2 4
5 2

Sample Output

4 2 3
思路:

边权是固定的求一遍BSF就好啦

代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <queue>
#define maxn 50005*2
using namespace std;
int read()
{
    char ch;int s=0,f=1;ch=getchar();
    while(ch>'9'||ch<'0') { if(ch=='-') f*=-1;ch=getchar(); }
    while(ch>='0'&&ch<='9') {s=s*10+ch-48;ch=getchar(); }
    return s*f;
}
struct node{
 int y,nxt;
}e[50005*2];
int head[20005],cnt,dis[20005];
int q[20010];
void add(int x,int y)
{
    cnt++;e[cnt].y=y,e[cnt].nxt=head[x];
    head[x]=cnt;
}
int step=-1;
 int n,m;
 void bfs()
 {
     memset(dis,-1,sizeof(dis));
     dis[1]=0,step=0;
     int h=0,t=1;q[0]=1;
     while(h!=t)
     {
         int now = q[h++];
         for(int i=head[now];i;i=e[i].nxt)
         {
             int v=e[i].y;
             if(dis[v]==-1)
             {
                 dis[v]=dis[now]+1;
                 step=max(dis[v],step);
                 q[t++]=v;
             }
         }
     }
 }
int main()
{
 n=read(),m=read();
 for(int i=1;i<=m;i++)
 {
     int u,v;
     u=read(),v=read();
     add(u,v),add(v,u);
 }
 bfs();
 int ans=0;
 int  dia;
 for(int i=n;i>=1;i--)
 {
     if(dis[i]==step)
        ans++,dia=i;
 }
 printf("%d %d %d",dia,step,ans);
 return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值