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

题目

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

Time Limit: 3 Sec  Memory Limit: 128 MB

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

题解

呃,这一题嘛。。就是一个SPFA嘛!我数组开小了,怒献一次WA!

代码

 1 /*Author:WNJXYK*/
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<queue>
 5 using namespace std;
 6 
 7 int n,m;
 8 
 9 struct Edge{
10     int v;
11     int t;
12     int nxt;
13     Edge(){}
14     Edge(int a,int b,int c){
15         v=a;t=b;nxt=c;
16     }
17 };
18 Edge e[100010];
19 int nume;
20 int head[20010];
21 inline void addSingleEdge(int x,int y,int w){
22     e[++nume]=Edge(y,w,head[x]);
23     head[x]=nume;
24 }
25 inline void addEdge(int x,int y,int w){
26     addSingleEdge(x,y,w);
27     addSingleEdge(y,x,w);
28 }
29 
30 queue<int> que;
31 double dist[20010];
32 bool inque[20010];
33 
34 inline void spfa(int src){
35     bool isPrint=false;
36     while(!que.empty()) que.pop();
37     memset(dist,127,sizeof(dist));
38     memset(inque,false,sizeof(inque));
39     que.push(src);
40     dist[src]=0;
41     inque[src]=true;
42     while(!que.empty()){
43         int now=que.front();
44         que.pop();
45         for (int i=head[now];i;i=e[i].nxt){
46             int v=e[i].v;int w=e[i].t;
47             if (dist[v]>dist[now]+w){
48                 dist[v]=dist[now]+w;
49                 if (!inque[v]){
50                     inque[v]=true;
51                     que.push(v);
52                 }
53             }
54         }
55     }
56 }
57 
58 int main(){
59     scanf("%d%d",&n,&m);
60     for (int i=1;i<=m;i++){
61         int x,y;
62         scanf("%d%d",&x,&y);
63         addEdge(x,y,1);
64     }
65     spfa(1);
66     int maxDist=0,minId=1,maxNum=1;
67     for (int i=2;i<=n;i++){
68         if (maxDist<dist[i]){
69             maxDist=dist[i];
70             minId=i;
71             maxNum=1;
72         }else if (maxDist==dist[i])maxNum++;
73     }
74     printf("%d %d %d\n",minId,maxDist,maxNum);
75     return 0;
76 }
View Code

 

posted @ 2014-11-04 22:03  WNJXYK  阅读(211)  评论(0编辑  收藏  举报

WNJXYK-我今年一定要努力!