Advertisement
Tbl_Mne_Ne_Dryg

Untitled

Sep 30th, 2020
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.41 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. // trip to new record: 2100 hard (last record: 1800)
  6.  
  7. vector<vector<pair<int, int>>> g;
  8. vector<bool> used;
  9. vector<int> tin;
  10. vector<int> tup;
  11. int timer = 0;
  12. vector<int> ans;
  13.  
  14. void dfs1(int v, int pr, int ind) { // dfs tree
  15.     used[v] = 1;
  16.     tin[v] = timer++;
  17.     tup[v] = tin[v];
  18.     for(int i = 0; i < g[v].size(); i++) {
  19.         int to = g[v][i].first;
  20.         if(g[v][i].second == ind) continue;
  21.         if(!used[to]) {
  22.             dfs1(to, v, g[v][i].second);
  23.             tup[v] = min(tup[v], tup[to]);
  24.         }
  25.         else {
  26.             tup[v] = min(tup[v], tin[to]);
  27.         }
  28.     }
  29.     if(tin[pr] < tup[v]) {
  30.         ans.push_back(ind);
  31.     }
  32. }
  33.  
  34. vector<bool> used3;
  35. int mx_ans = 0;
  36. int versh = 0;
  37. void dfs2(int v, int depth) { // 1 case
  38.     if(depth > mx_ans) {
  39.         mx_ans = depth;
  40.         versh = v;
  41.     }
  42.     used3[v] = true;
  43.     for(int i = 0; i < g[v].size(); i++) {
  44.         int to = g[v][i].first;
  45.         if(!used3[to]) {
  46.             dfs2(to, ++depth);
  47.         }
  48.     }
  49. }
  50.  
  51. vector<int> pr;
  52. vector<bool> used2;
  53. void dfs3(int v, int pred) { // 2 case
  54.     used2[v] = true;
  55.     for(int i = 0; i < g[v].size(); i++) {
  56.         int to = g[v][i].first;
  57.         if(to == pred) continue;
  58.         if(!used2[to] && tup[to] == 0) {
  59.             pr[to] = v;
  60.             dfs3(to, v);
  61.         }
  62.     }
  63.     int ver = v;
  64.     vector<int> path;
  65.     while(ver != 0) {
  66.         path.push_back(ver);
  67.         ver = pr[ver];
  68.     }
  69.     path.push_back(0);
  70.     reverse(path.begin(), path.end());
  71.     for(auto& i : path) i++;
  72.     cout << path.size() << '\n';
  73.     for(int i = 0; i < path.size(); i++) cout << path[i] << ' ';
  74.     exit(0);
  75. }
  76.  
  77. int main() {
  78.     int n, m;
  79.     cin >> n >> m;
  80.     g.resize(n);
  81.     tin.resize(n);
  82.     tup.resize(n);
  83.     used.resize(n);
  84.     pr.resize(n);
  85.     used2.resize(n);
  86.     used3.resize(n);
  87.     for(int i = 0; i < m; i++) {
  88.         int a, b;
  89.         cin >> a >> b;
  90.         if(a > b) {
  91.             swap(a, b);
  92.         }
  93.         a--;
  94.         b--;
  95.         g[a].push_back({b, i});
  96.         g[b].push_back({a, i});
  97.     }
  98.     for(int i = 0; i < n; i++) {
  99.         if(!used[i]) {
  100.             dfs1(i, i, -1);
  101.         }
  102.     }
  103.  
  104.     if(count(tup.begin(), tup.end(), 0) == 1) {
  105.         cout << -1 << '\n';
  106.         dfs2(0, 0);
  107.         cout << versh + 1;
  108.     }
  109.     else {
  110.         dfs3(0, 0);
  111.     }
  112. }
  113.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement