Advertisement
YEZAELP

TOI12: weakpoint

Jul 2nd, 2021
1,277
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.80 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. const int INF = 1e9;
  5. const int N = 5e5 + 10;
  6. vector <int> g[N];
  7. int n, p;
  8.  
  9. /// cycle
  10. bool is_cycle[N];
  11. int par[N], color[N];
  12. bool Cycle(int u, int pre){
  13.     if(color[u] == 2) return false;
  14.     if(color[u] == 1){
  15.         while(pre != u){
  16.             is_cycle[pre] = true;
  17.             pre = par[pre];
  18.         }
  19.         is_cycle[u] = true;
  20.         return true;
  21.     }
  22.     color[u] = 1;
  23.     par[u] = pre;
  24.     for(auto v: g[u]){
  25.         if(v == pre) continue;
  26.         if(Cycle(v, u)) return true;
  27.     }
  28.     color[u] = 2;
  29.     return false;
  30. }
  31.  
  32. /// count node
  33. int node[N];
  34. int Count(int u, int pre){
  35.     if(is_cycle[u]) return 0;
  36.     if(node[u] != 0) return node[u];
  37.     node[u] = 1;
  38.     for(auto v: g[u]){
  39.         if(pre != v)
  40.             node[u] += Count(v, u);
  41.     }
  42.     return node[u];
  43. }
  44. void CountNode(){
  45.     for(int u=1;u<=n;u++){
  46.         if(is_cycle[u]){
  47.             node[u] = 1;
  48.             for(auto v: g[u])
  49.                 node[u] += Count(v, 0);
  50.         }
  51.     }
  52. }
  53.  
  54. ///
  55. void Solve1(){
  56.     int mx = -INF, ans_node = INF;
  57.     for(int u=1;u<=n;u++){
  58.         if(u == p) continue;
  59.         if(node[u] > mx){
  60.             mx = node[u];
  61.             ans_node = u;
  62.         }
  63.         else if(node[u] == mx)
  64.             ans_node = min(ans_node, u);
  65.     }
  66.  
  67.     printf("%d\n%d", ans_node, mx - 1);
  68. }
  69.  
  70. ///
  71. bool vs[N];
  72. bool FindCycle(int st){
  73.     queue <int> q;
  74.     q.push(st);
  75.     while(!q.empty()){
  76.         int u = q.front();
  77.         q.pop();
  78.         if(vs[u]) continue;
  79.         vs[u] = true;
  80.         if(is_cycle[u]) return true;
  81.         for(auto v: g[u]) q.push(v);
  82.     }
  83.     return false;
  84. }
  85. void Solve2(){
  86.     int mx = -INF, ans_node = INF;
  87.     int sum = 0, cycle_node = -1;
  88.     for(auto u: g[p]){
  89.         if(cycle_node == -1 and FindCycle(u))
  90.             cycle_node = u;
  91.         else{
  92.             sum += node[u];
  93.             if(node[u] > mx){
  94.                 mx = node[u];
  95.                 ans_node = u;
  96.             }
  97.             else if(mx == node[u])
  98.                 ans_node = min(ans_node, u);
  99.         }
  100.     }
  101.  
  102.     int count_cycle_node = n - sum - 1;
  103.     if(count_cycle_node > mx){
  104.         mx = count_cycle_node;
  105.         ans_node = cycle_node;
  106.     }
  107.     else if(count_cycle_node == mx)
  108.         ans_node = min(ans_node, cycle_node);
  109.  
  110.     printf("%d\n%d", ans_node, mx - 1);
  111. }
  112.  
  113. int main(){
  114.  
  115.     scanf("%d%d", &n, &p);
  116.  
  117.     for(int i=1;i<=n;i++){
  118.         int u, v;
  119.         scanf("%d%d", &u, &v);
  120.         g[u].push_back(v);
  121.         g[v].push_back(u);
  122.     }
  123.  
  124.     Cycle(1, 0);
  125.  
  126.     CountNode();
  127.  
  128.     if(is_cycle[p]) Solve1();
  129.     else Solve2();
  130.  
  131.     return 0;
  132. }
  133.  
  134. /**
  135.  
  136. 15 12
  137. 1 2
  138. 2 3
  139. 2 4
  140. 4 15
  141. 15 6
  142. 4 5
  143. 5 7
  144. 6 7
  145. 8 5
  146. 5 9
  147. 7 10
  148. 7 11
  149. 6 12
  150. 12 13
  151. 12 14
  152.  
  153. 5 1
  154. 1 2
  155. 2 3
  156. 3 4
  157. 4 5
  158. 5 2
  159. 2
  160. 3
  161.  
  162. **/
  163.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement