Advertisement
Guest User

Untitled

a guest
Oct 16th, 2018
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.15 KB | None | 0 0
  1. #include <cstdlib>
  2. #include <iostream>
  3. #include <vector>
  4. #include <string>
  5. #include <cmath>
  6. #include <unordered_map>
  7. #include <stack>
  8. #include <cassert>
  9. #include <algorithm>
  10. #include <iomanip>
  11. #include <map>
  12. #include <queue>
  13. #include <set>
  14.  
  15. #include <iostream>
  16. #include <climits>
  17. #include <vector>
  18. #include <cassert>
  19. #include <algorithm>
  20. #include <set>
  21. #include <map>
  22. #include <set>
  23.  
  24. using namespace std;
  25.  
  26. vector<vector<int>> gr;
  27. const int MAXN = 1e5 + 100;
  28. int p[MAXN];
  29. bool used[MAXN];
  30. int h[MAXN];
  31. int was[MAXN];
  32. pair<int, int> what[MAXN];
  33.  
  34. set<pair<int, int>> banned;
  35. vector<pair<int, int>> edges;
  36. void Dfs(int v, int hh = 0) {
  37.     used[v] = true;
  38.     h[v] = hh;
  39.     for (auto el : gr[v]) {
  40.         if (!used[el]) {
  41.             p[el] = v;
  42.             banned.emplace(min(v, el), max(v, el));
  43.             Dfs(v, hh + 1);
  44.         }
  45.     }
  46. }
  47.  
  48. int main() {
  49.     freopen("input.txt", "r", stdin);
  50. //    freopen("intel.out", "w", stdout);
  51.  
  52.     ios_base::sync_with_stdio(0);
  53.     cin.tie();
  54.  
  55.     int T;
  56.     cin >> T;
  57.     while (T--) {
  58.         int n, m;
  59.         cin >> n >> m;
  60.         gr.clear();
  61.         gr.resize(n);
  62.         banned.clear();
  63.         for (int i = 0; i < n; i++) {
  64.             used[i] = false;
  65.             p[i] = -1;
  66.             was[i] = -1;
  67.         }
  68.  
  69.         for (int i = 0; i < m; i++) {
  70.             int u, v;
  71.             cin >> u >> v;
  72.             u--;
  73.             v--;
  74.             gr[u].push_back(v);
  75.             gr[v].push_back(u);
  76.             edges.emplace_back(min(u, v), max(u, v));
  77.         }
  78.         for (int i = 0; i < n; i++) {
  79.             if (!used[i]) {
  80.                 Dfs(i);
  81.             }
  82.         }
  83.         int cnt = 0;
  84.  
  85.         pair<int, int> e1{-1, -1};
  86.         pair<int, int> e2{-1, -1};
  87.         try {
  88.             for (const auto &edge : edges) {
  89.                 if (banned.count(edge)) {
  90.                     continue;
  91.                 }
  92.                 int u = edge.first;
  93.                 int v = edge.second;
  94.                 what[cnt] = {u, v};
  95.  
  96.                 if (h[u] > h[v]) {
  97.                     swap(u, v);
  98.                 }
  99.                 while (h[u] < h[v]) {
  100.                     was[u] = cnt;
  101.                     u = p[u];
  102.                 }
  103.                 while (u != v) {
  104.                     if (was[u] != -1) {
  105.                         e1 = what[was[u]];
  106.                         e2 = edge;
  107.                         throw 1;
  108.                     }
  109.                     was[u] = cnt;
  110.                     was[v] = cnt;
  111.                     u = p[u];
  112.                     v = p[v];
  113.                 }
  114.             }
  115.         } catch (...) {
  116.             set<int> meet;
  117.  
  118.             auto add = [&](int v) {
  119.                 if (meet.count(v)) {
  120.                     meet.erase(v);
  121.                 } else {
  122.                     meet.insert(v);
  123.                 }
  124.             };
  125.  
  126.             auto proc = [&](set<pair<int, int>>& st, int u, int v) {
  127.                 if (h[u] > h[v]) {
  128.                     swap(u, v);
  129.                 }
  130.                 while (h[u] < h[v]) {
  131.                     pair<int, int> ee(min(u, p[u]), max(u, p[u]));
  132.                     if (st.count(ee)) {
  133.                         add(ee.first);
  134.                         add(ee.second);
  135.                     }
  136.                     st.insert(ee);
  137.                     u = p[u];
  138.                 }
  139.                 while (u != v) {
  140.                     pair<int, int> ee1(min(u, p[u]), max(u, p[u]));
  141.                     pair<int, int> ee2(min(v, p[v]), max(v, p[v]));
  142.                     if (st.count(ee1)) {
  143.                         add(ee1.first);
  144.                         add(ee1.second);
  145.                     }
  146.                     if (st.count(ee2)) {
  147.                         add(ee2.first);
  148.                         add(ee2.second);
  149.                     }
  150.                    
  151.                     st.insert(ee1);
  152.                     st.insert(ee2);
  153.                     u = p[u];
  154.                     v = p[v];
  155.                 }
  156.             };
  157.             set<pair<int, int>> s1;
  158.             proc(s1, e1.first, e1.second);
  159.  
  160.             assert(meet.size() == 2);
  161.         }
  162.  
  163.  
  164.     }
  165.  
  166.  
  167.     return 0;
  168. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement