Advertisement
Vince14

Cow At Large

Feb 23rd, 2023 (edited)
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.32 KB | Source Code | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <cstring>
  4. #include <algorithm>
  5. #include <cmath>
  6. #include <vector>
  7. #include <set>
  8. #include <map>
  9. #include <stack>
  10. #include <queue>
  11. #include <deque>
  12. #include <unordered_map>
  13. #include <numeric>
  14. #include <iomanip>
  15. using namespace std;
  16. #define pii pair<int, int>
  17. #define FAST ios_base::sync_with_stdio(false); cin.tie(NULL)
  18. const int dx[4] = {0, 1, 0, -1}, dy[4] = {1, 0, -1, 0};
  19. const int MOD = 1e9;
  20. const int MAX = 100005;
  21.  
  22.  
  23. int n, s;
  24. vector<int> v[MAX];
  25. vector<int> leafs;
  26. vector<pii> critical;
  27. int visited[MAX];
  28. int parent[MAX];
  29. int dist[MAX];
  30.  
  31. void find_leaf(int cur, int par){
  32.     if(visited[cur] == 1){
  33.         return;
  34.     }
  35.     visited[cur] = 1;
  36.     if(v[cur].size() == 1 and cur != s){
  37.         leafs.push_back(cur);
  38.     }
  39.     for(auto nxt : v[cur]){
  40.         if(nxt != par){
  41.             find_leaf(nxt, cur);
  42.         }
  43.     }
  44. }
  45.  
  46. void print_leaf(){
  47.     cout << "Leaf: ";
  48.     for(auto x : leafs){
  49.         cout << x << " ";
  50.     }
  51.     cout << "\n";
  52. }
  53.  
  54. void print_visited(){
  55.     cout << "Visited: ";
  56.     for(int i = 1; i <= n; i++){
  57.         cout << visited[i] << " ";
  58.     }
  59.     cout << "\n";
  60. }
  61.  
  62. void print_critical(){
  63.     cout << "Critical points: ";
  64.     for(auto x : critical){
  65.         cout << x.second << " ";
  66.     }
  67.     cout << "\n";
  68.     cout << "Critical dist: ";
  69.     for(auto x : critical){
  70.         cout << x.first << " ";
  71.     }
  72.     cout << "\n";
  73. }
  74.  
  75. void print_parent(){
  76.     cout << "Parent: ";
  77.     for(int i = 1; i <= n; i++){
  78.         cout << parent[i] << " ";
  79.     }
  80.     cout << "\n";
  81. }
  82.  
  83. void find_crit(){
  84.     memset(visited, 0, sizeof visited);
  85.     queue<pii> pq; // cur, 1 or 2
  86.     for(auto leaf : leafs){
  87.         pq.push({leaf, leaf});
  88.     }
  89.     pq.push({s, -1});
  90.     while(!pq.empty()){
  91.         int cur = pq.front().first;
  92.         int tmp = pq.front().second; // stores whether cow or farmer
  93.         pq.pop();
  94.         if(visited[cur] != 0){
  95.             continue;
  96.         }
  97.         parent[cur] = tmp;
  98.         if(tmp == -1){
  99.             visited[cur] = 1;
  100.         }
  101.         else{
  102.             visited[cur] = 2;
  103.         }
  104.         for(auto nxt : v[cur]){
  105.             if(visited[nxt] != 0){
  106.                 continue;
  107.             }
  108.             else{
  109.                 pq.push({nxt, tmp});
  110.             }
  111.         }
  112.     }
  113.     pq.push({s, 0});
  114.     while(!pq.empty()){
  115.         int cur = pq.front().first;
  116.         int d = pq.front().second;
  117.         pq.pop();
  118.         if(visited[cur] == 2){
  119.             visited[cur] == 3;
  120.             critical.push_back({d, cur});
  121.             continue;
  122.         }
  123.         if(visited[cur] == 3){
  124.             continue;
  125.         }
  126.         visited[cur] = 3;
  127.         for(auto nxt : v[cur]){
  128.             pq.push({nxt, d + 1});
  129.         }
  130.     }
  131.     sort(critical.begin(), critical.end());
  132. }
  133.  
  134. bool check(int x){
  135.     memset(visited, 0, sizeof visited);
  136.     queue<pii> pq;
  137.     for(int i = 0; i < x; i++){
  138.         pq.push({parent[critical[i].second], 2});
  139.     }
  140.     pq.push({s, 1});
  141.     while(!pq.empty()){
  142.         int cur = pq.front().first;
  143.         int tmp = pq.front().second; // stores whether cow or farmer
  144.         pq.pop();
  145.         if(visited[cur] != 0){
  146.             continue;
  147.         }
  148.         visited[cur] = tmp;
  149.         for(auto nxt : v[cur]){
  150.             if(visited[nxt] != 0){
  151.                 continue;
  152.             }
  153.             else{
  154.                 pq.push({nxt, tmp});
  155.             }
  156.         }
  157.     }
  158.     for(auto cur : leafs){
  159.         if(visited[cur] == 1){
  160.             // cout << "Failed: " << x << " " << cur << "\n";
  161.             return false;
  162.         }
  163.     }
  164.     return true;
  165. }
  166.  
  167. void binary_search(){
  168.     int lo = 1, hi = (int)critical.size();
  169.     while(lo < hi){
  170.         int mid = (lo + hi) / 2;
  171.         if(!check(mid)){ // need more farmers
  172.             lo = mid + 1;
  173.         }
  174.         else{
  175.             hi = mid;
  176.         }
  177.     }
  178.     cout << lo << "\n";
  179. }
  180.  
  181.  
  182. int main() {
  183.     FAST;
  184.     freopen("atlarge.in", "r", stdin);
  185.     freopen("atlarge.out", "w", stdout);
  186.     cin >> n >> s;
  187.     for(int x, y,i = 0; i < n - 1; i++){
  188.         cin >> x >> y;
  189.         v[x].push_back(y);
  190.         v[y].push_back(x);
  191.     }
  192.     find_leaf(s, -1);
  193.     //print_leaf();
  194.     find_crit();
  195.     //print_visited();
  196.     //print_critical();
  197.     //print_parent();
  198.     binary_search();
  199. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement