zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    2017北京网络赛 J Pangu and Stones 区间DP(石子归并)
    2017北京网络赛 F Secret Poems 蛇形回路输出
    2017 北京网络赛 E Cats and Fish
    CF 1198 A. MP3 模拟+滑动窗口
    博弈论
    gym 101911
    容器STL
    POJ 3281 Dining 最大流+拆点
    hdu 1533 Going Home 最小费用最大流 (模板题)
    C#博文搜集
  • 原文地址:https://www.cnblogs.com/naix-x/p/3310062.html
Copyright © 2011-2022 走看看