题目
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
Sample Output
4 2 3
HINT
Source
题解
呃,这一题嘛。。就是一个SPFA嘛!我数组开小了,怒献一次WA!
代码
1 /*Author:WNJXYK*/ 2 #include3 #include 4 #include 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 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