Advertisement
ke_timofeeva7

вершинная двусвязность

Nov 16th, 2022 (edited)
1,000
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.75 KB | None | 0 0
  1. /*
  2. ЗАПУСКАЕМ
  3. ░░◐░░◐░░░ХАЧИКУДЖИ░░░░░░░░░
  4. ░░▐░░▌░░░░░░▄▄▄▄░░░░░░░░░░░
  5. ░░▐░░▌░░░▄▀▀░▄▄▄▀▀▄░░░░░░░░
  6. ░░▐▄▄▌░▐▀░▐▀▀░▄░▀▌░▀▌░░░░░░
  7. ░▐░░░░▀▐░▐░░░▄▄▌░░▌░▀▌░░░░░
  8. ░░▀▌░░░▐▄░▀▀▀░░░▄▄▌░▄▌░░░░░
  9. ░░░░▀▄░░░▐▄▄▄▀▀▀░░▄▀░░░░░░░
  10. ░░░░░░▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀░░░░░
  11. */
  12. #pragma GCC optimize("Ofast,unroll-loops")
  13. #pragma GCC target("avx,avx2,fma,sse4")
  14. #pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,unswitch-loops,fast-math")
  15. #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,avx2,tune=native")
  16. #include <iostream>
  17. #include <string>
  18. #include <sstream>
  19. #include <cmath>
  20. #include <memory.h>
  21. #include <algorithm>
  22. #include <stack>
  23. #include <deque>
  24. #include <iomanip>
  25. #include <stdio.h>
  26. #include <queue>
  27. #include <map>
  28. #include <set>
  29. #include <unordered_map>
  30. #include <unordered_set>
  31. #include <random>
  32. #include <ctime>
  33. #include <cstdlib>
  34. #include <cassert>
  35. #include <iterator>
  36. #include <chrono>
  37. #include <array>
  38. #include <bitset>
  39. //#define int long long
  40. #define itn long long
  41. #define fro for
  42. #define intt __int128
  43. #define pii pair <int, int>
  44. #define debug(x) cerr << (#x) << " " << (x) << endl
  45. #define pb push_back
  46. #define all(vc) vc.begin(), vc.end()
  47. #define fir first
  48. #define sec second
  49. #define endl "\n"
  50. #define un unsigned
  51. #define INF 1000000010
  52. #define EPS 0.0000000001
  53. #define double long double
  54. using namespace std;
  55.  
  56. const int N = 200005, R = 1 << 20, MOD = 1e9 + 7, ABC = 26, logn = 20;
  57. const int BUBEN = 1001;
  58. const double PI = acos(-1);
  59.  
  60. mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count());
  61.  
  62. map<pii, int> num;
  63. map<pii, int> mp;
  64. int up[N], d[N];
  65. vector<bool> used(N);
  66. bool art_point[N];
  67.  
  68. void dfs(vector<vector<int>>& gr, int v, int p = -1) {
  69.     used[v] = 1;
  70.     if (p != -1)
  71.         d[v] = d[p] + 1;
  72.     else
  73.         d[v] = 1;
  74.     up[v] = d[v];
  75.     int cnt = 0;
  76.     for (int i : gr[v]) {
  77.         if (!used[i]) {
  78.             cnt++;
  79.             dfs(gr, i, v);
  80.             up[v] = min(up[i], up[v]);
  81.             if (up[i] >= d[v] && p != -1) {
  82.                 art_point[v] = 1;
  83.             }
  84.         }
  85.         else if (i != v) {
  86.             up[v] = min(up[v], d[i]);
  87.         }
  88.     }
  89.     if (p == -1 && cnt > 1)
  90.         art_point[v] = 1;
  91. }
  92.  
  93. int color[N];
  94. int mxcolor = 0;
  95. map<pii, int>suka;
  96. void dfs2(vector<vector<int>>& gr, int v, int p, int cur) {
  97.     used[v] = 1;
  98.     for (int u : gr[v]) {
  99.         if (p == u)
  100.             continue;
  101.  
  102.         if (!used[u]) {
  103.             if (art_point[v] && up[u] >= d[v]) {
  104.                 mxcolor++;
  105.                 suka[{u, v}] = mxcolor;
  106.                 suka[{v, u}] = mxcolor;
  107.                 dfs2(gr, u, v, mxcolor);
  108.             }
  109.             else {
  110.                 suka[{u, v}] = cur;
  111.                 suka[{v,u}] = cur;
  112.                 dfs2(gr, u, v, cur);
  113.             }
  114.         }
  115.         if (d[u] < d[v]) {
  116.             suka[{u, v}] = cur;
  117.             suka[{v, u}] = cur;
  118.         }
  119.     }
  120. }
  121.  
  122. bool cmp(set<int>& a, set<int>& b) {
  123.     if (a.size() > 0)
  124.         if (b.size() > 0)
  125.             return *a.begin() < *b.begin();
  126.         else
  127.             return 1;
  128.     else
  129.         return 0;
  130. }
  131.  
  132. signed main() {
  133.     ios_base::sync_with_stdio(0);
  134.     cin.tie(0);
  135.     cout.tie(0);
  136.     srand(time(0));
  137.     cout.precision(17);
  138.  
  139.     int n, m;
  140.     cin >> n >> m;
  141.  
  142.     vector<vector<int>> gr(n + 1);
  143.     vector<pii> kok(m + 1);
  144.     for (int i = 0; i < m; i++) {
  145.         int a, b;
  146.         cin >> a >> b;
  147.         gr[a].push_back(b);
  148.         gr[b].push_back(a);
  149.         mp[{a, b}]++;
  150.         mp[{b, a}]++;
  151.         num[{a, b}] = i + 1;
  152.         num[{b, a}] = i + 1;
  153.         kok[i+1] = { a, b };
  154.     }
  155.  
  156.     fro(int i = 1; i <= n; i++)
  157.         if (!used[i])
  158.             dfs(gr, i, i);
  159.     used.assign(n + 1, 0);
  160.     for (int i = 1; i <= n; i++)
  161.         if (!used[i]) {
  162.             mxcolor++;
  163.             dfs2(gr, i, -1, mxcolor);
  164.         }
  165.     vector<set<int>> lol(n + 1);
  166.     for (int i = 1; i <= m; i++) {
  167.         lol[suka[kok[i]]].insert(i);
  168.     }
  169.     sort(all(lol), cmp);
  170.     int cntt = 0;
  171.     for (int i = 0; i < lol.size(); i++)
  172.         if (lol[i].size() > 0)
  173.             cntt++;
  174.     for (int i = 0; i <= n; i++)
  175.         for (int j : lol[i])
  176.             color[j] = i + 1;
  177.     cout << cntt << endl;
  178.     for (int i = 1; i <= m; i++)
  179.         cout << color[i] << " ";
  180.     return 0;
  181. }
  182. /*
  183. 5 5
  184. 1 2
  185. 1 2
  186. 2 3
  187. 3 4
  188. 3 4
  189. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement