BZOJ 3402: [Usaco2009 Open]Hide and Seek 捉迷藏
题目
3402: [Usaco2009 Open]Hide and Seek 捉迷藏
Time Limit: 3 Sec Memory Limit: 128 MBDescription
贝茜在和约翰玩一个“捉迷藏”的游戏.
她正要找出所有适合她躲藏的安全牛棚.一共有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
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 }