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\n",dis[v]);

94         }

95     }

96     return 0;

97 }

 

你可能感兴趣的:(codeforces)