Advertisement
vahook

IOI Válogató 2019 / 5. Banda szétválasztása

May 12th, 2020
518
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.57 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. #define MAXN 10000
  5. #define MAXM 500000
  6.  
  7. using namespace std;
  8.  
  9. vector<int> pontok[MAXN+1];
  10.  
  11. int N, M;
  12.  
  13. int tin[MAXN+1];
  14. int low[MAXN+1];
  15. int cnt = 1;
  16.  
  17. int valasz_komponens = 0, valasz_maxelottunk = 0, valasz = 1;
  18.  
  19. int
  20. tarjan(int current, int parent)
  21. {
  22.     low[current] = tin[current] = cnt++;
  23.     int komponensek = 1;    /* Hány komponensre szakítaná szét a gráfot a pont kivétele */
  24.     int mi = 1;             /* Mennyi pont van előttünk + mi */
  25.     int maxelottunk = 0;    /* Legnagyobb előttünk lévő komponens csúcsszáma */
  26.     int mogottunk = N - 1;  /* A szülőnkkel egy komponensben hányan vannak */
  27.  
  28.     bool elvagopont = false;
  29.     for(const auto next : pontok[current]) {
  30.         if(next == parent) continue;
  31.  
  32.         if(!tin[next]) {
  33.             int gyerekek = tarjan(next, current);
  34.  
  35.             /* Ha a pont elvágó pont, és kivételével létrejönne az a komponens, aminek pontja a 'next' azonosítójú */
  36.             if(tin[current] <= low[next]) {
  37.                 elvagopont = true;
  38.                 maxelottunk = max(maxelottunk, gyerekek);
  39.                 mogottunk -= gyerekek;
  40.                 komponensek++;
  41.             }
  42.             mi += gyerekek;
  43.  
  44.             low[current] = min(low[current], low[next]);
  45.         }else{
  46.             low[current] = min(low[current], tin[next]);
  47.         }
  48.     }
  49.    
  50.     /* Ha elvágó pont volt + speciális vizsgálat a legelső pontra. */
  51.     if(elvagopont && (current != 1 || (--komponensek >= 2))) {
  52.         /* Lehet hogy a szülőnk komponense nagyobb, hiszen ezt az előbb nem vizsgáltuk. */
  53.         maxelottunk = max(maxelottunk, mogottunk);
  54.  
  55.         /* Ha ez a pont a feladat szövege szerint jobb mint az eddigi, jegyezzük meg. */
  56.         if(komponensek > valasz_komponens || (komponensek == valasz_komponens && maxelottunk <= valasz_maxelottunk)
  57.            ){            
  58.             /* Ha a legkisebb sorszámú */
  59.             if(komponensek != valasz_komponens || maxelottunk != valasz_maxelottunk || current < valasz)
  60.                 valasz = current;
  61.             valasz_komponens = komponensek;
  62.             valasz_maxelottunk = maxelottunk;
  63.  
  64.         }
  65.     }
  66.  
  67.     return mi;
  68. }
  69.  
  70. int
  71. main()
  72. {
  73.     ios_base::sync_with_stdio(0);
  74.  
  75.     /* Beolvasás */
  76.     cin >> N >> M;
  77.     for(int i = 0; i < M; i++) {
  78.         int a, b;
  79.         cin >> a >> b;
  80.         pontok[a].push_back(b);
  81.         pontok[b].push_back(a);
  82.     }
  83.  
  84.     /* Megoldás */
  85.     tarjan(1, 1);
  86.    
  87.     /* Kiírás */
  88.     cout << valasz << endl;
  89.  
  90.     return 0;
  91. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement