您的位置:首页 > 运维架构

BZOJ—— 3402: [Usaco2009 Open]Hide and Seek 捉迷藏

2017-11-26 20:27 393 查看

http://www.lydsy.com/JudgeOnline/problem.php?id=3402

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

HINT

 

Source

Silver

 

SPFA 对于一个到达过的点,更新他的最小值,没到达的更新当前值,

记录到达每个点的次数,最后找出最长距离判断判断就好了。

#include <cstring>
#include <cstdio>
#include <queue>

inline void read(int &x)
{
x=0; register char ch=getchar();
for(; ch>'9'||ch<'0'; ) ch=getchar();
for(; ch>='0'&&ch<='9'; ch=getchar()) x=x*10+ch-'0';
}

const int M(50005);
const int N(20005);

int n,m,head
,sumedge;
int _v[M<<1],_nex[M<<1];
inline void ins(int u,int v)
{
_v[++sumedge]=v,_nex[sumedge]=head[u];head[u]=sumedge;
_v[++sumedge]=u,_nex[sumedge]=head[v];head[v]=sumedge;
}

bool inq
;
int dis
,cnt
,id[M];

inline void SPFA(int s)
{
for(int i=1; i<=n; ++i) dis[i]=-1;
std:: queue<int>que;
dis[s]=0; que.push(s);
for(int u,v; !que.empty(); )
{
u=que.front(); que.pop(); inq[u]=0;
for(int i=head[u]; i; i=_nex[i])
{
if(dis[_v[i]]==-1)
{
cnt[_v[i]]++;
dis[_v[i]]=dis[u]+1;
if(!inq[_v[i]])
{
que.push(_v[i]);
inq[_v[i]]=true;
}
}
else if(dis[_v[i]]>dis[u]+1)
{
cnt[_v[i]]++;
dis[_v[i]]=dis[u]+1;
if(!inq[_v[i]])
{
que.push(_v[i]);
inq[_v[i]]=true;
}
}
}

}
}

int Presist()
{
read(n),read(m);
for(int u,v; m--; )
read(u),read(v),ins(u,v);
SPFA(1); int now=-1,pos,num;
for(int i=1; i<=n; ++i)
if(dis[i]>now) now=dis[i],pos=i,num=cnt[i];
printf("%d %d ",pos,now); num=0;
for(int i=1; i<=n; ++i) num+=(dis[i]==now);
printf("%d\n",num);
return 0;
}

int Aptal=Presist();
int main(int argc,char**argv){;}

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: