Codeforces Round #199 (Div. 2) E. Xenia and Tree

题目链接

2了,差点就A了。。。这题真心不难,开始想的就是暴力spfa就可以,直接来了一次询问,就来一次的那种,TLE了,想了想,存到栈里会更快,交又TLE了。。无奈C又被cha了,我忙着看C去了。。。这题,是我一个地方写错了。。top = 0的时候会死循环吗?貌似不会把,反正我加了这个判断,就A了,可能优化了一下把。

 1 #include <cstring>
 2 #include <cstdio>
 3 #include <string>
 4 #include <iostream>
 5 #include <algorithm>
 6 #include <cmath>
 7 #include <queue>
 8 using namespace std;
 9 #define INF 1000000
10 int first[200001];
11 int dis[200001];
12 int in[200001];
13 int s[200001];
14 int n,t,top;
15 struct node
16 {
17     int u,v,next;
18 }edge[300001];
19 void CL()
20 {
21     t = 0;
22     memset(first,-1,sizeof(first));
23 }
24 void add(int u,int v)
25 {
26     edge[t].u = u;
27     edge[t].v = v;
28     edge[t].next = first[u];
29     first[u] = t ++;
30 }
31 void spfa()
32 {
33     int i,u,v;
34     for(i = 1;i <= n;i ++)
35     in[i] = 0;
36     queue<int>que;
37     for(i = 0;i < top;i ++)
38     {
39         in[s[i]] = 1;
40         dis[s[i]] = 0;
41         que.push(s[i]);
42     }
43     while(!que.empty())
44     {
45         u = que.front();
46         que.pop();
47         in[u] = 0;
48         for(i = first[u];i != -1;i = edge[i].next)
49         {
50             v = edge[i].v;
51             if(dis[v] > dis[u] + 1)
52             {
53                 dis[v] = dis[u] + 1;
54                 if(!in[v])
55                 {
56                     in[v] = 1;
57                     que.push(v);
58                 }
59             }
60         }
61     }
62     return ;
63 }
64 int main()
65 {
66     int m,i,u,v;
67     CL();
68     scanf("%d%d",&n,&m);
69     for(i = 1;i < n;i ++)
70     {
71         scanf("%d%d",&u,&v);
72         add(u,v);
73         add(v,u);
74     }
75     for(i = 1;i <= n;i ++)
76     dis[i] = INF;
77     top = 1;
78     s[0] = 1;
79     spfa();
80     top = 0;
81     for(i = 1;i <= m;i ++)
82     {
83         scanf("%d%d",&u,&v);
84         if(u == 1)
85         {
86             s[top ++] = v;
87         }
88         else
89         {
90             if(top != 0)//这里
91             spfa();
92             top = 0;
93             printf("%d
",dis[v]);
94         }
95     }
96     return 0;
97 }
原文地址:https://www.cnblogs.com/naix-x/p/3310062.html