Advertisement
K_Y_M_bl_C

Untitled

Sep 17th, 2017
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.09 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. typedef long long ll;
  6. typedef vector<int> vi;
  7. typedef pair<int, int> pii;
  8.  
  9. #define ff first
  10. #define ss second
  11. #define y1 y111
  12. #define X first
  13. #define Y second
  14. #define mk make_pair
  15. #define inb push_back
  16. #define all(v) v.begin(), v.end()
  17.  
  18. const int MAXN = (int)1e6 + 9, MAXN1 = (int)2e4 + 7;
  19. const int INFint = (int)1e9 + 7, P = 31;
  20. const ll INFll = (ll)1e18 + 7, MOD = (ll)1e9 + 7;
  21. const double INFfl = 1e18 * 4 + 7;
  22. const double EPS = 1e-7;
  23. const double PI = atan2(0, -1);
  24.  
  25. vector < pair <int, int> > g[MAXN];
  26. int n, m, x, y, t, t_in[MAXN], up[MAXN], col, color[MAXN], mx_cnt, cnt_nom;
  27. int cnt[MAXN], w[MAXN];
  28. bool used[MAXN], in_ans[MAXN], most[MAXN];
  29.  
  30.  
  31. vector < pair < int, pair <int, int> > > ans;
  32.  
  33. int solve();
  34.  
  35. int main()
  36. {
  37. #define TASK ""
  38. #ifdef _DEBUG
  39.     freopen("input.txt", "r", stdin), freopen("output.txt", "w", stdout);
  40. #else
  41.     //freopen(TASK".in", "r", stdin), freopen(TASK".out", "w", stdout);
  42. #endif
  43.     solve();
  44. }
  45.  
  46. const int STRBUF = (int)1e6 + 7;
  47. char buf[STRBUF];
  48. string get_str()
  49. {
  50.     scanf(" %s", buf);
  51.     return string(buf);
  52. }
  53.  
  54. void dfs (int v, int nom)
  55. {
  56.     used[v] = 1;
  57.     t++;
  58.     t_in[v] = t;
  59.     up[v] = t;
  60.  
  61.     for (int i = 0; i < g[v].size(); ++i)
  62.     {
  63.         if (nom == g[v][i].ss)
  64.             continue;
  65.         int u = g[v][i].ff;
  66.         if (used[u])
  67.         {
  68.             up[v] = min(up[v], t_in[u]);
  69.             continue;
  70.         }
  71.         dfs(u, g[v][i].ss);
  72.         up[v] = min(up[v], up[u]);
  73.         if (t_in[v] < up[u])
  74.         {
  75.             most[g[v][i].ss] = 1;
  76.         }
  77.     }
  78. }
  79.  
  80. void dfs1(int v)
  81. {
  82.     color[v] = col;
  83.     for (int i = 0; i < g[v].size(); ++i)
  84.     {
  85.         if (!color[g[v][i].ff] && !most[g[v][i].ss])
  86.         {
  87.             //cout << col << ' ' << g[v][i].ff << ' ' << g[v][i].ss << '\n';
  88.             dfs1(g[v][i].ff);
  89.         }
  90.     }
  91. }
  92.  
  93. void dfs_fin (int v)
  94. {
  95.     int u;
  96.     used[v] = 1;
  97.     for (int i = 0; i < g[v].size(); ++i)
  98.     {
  99.         u = g[v][i].ff;
  100.         if (!in_ans[g[v][i].ss])
  101.         {
  102.             if (!most[g[v][i].ss])
  103.             {
  104.                 ans.push_back({g[v][i].ss, {v, u}});
  105.             }
  106.             else
  107.             {
  108.                 ans.push_back({g[v][i].ss, {u, v}});
  109.             }
  110.             in_ans[g[v][i].ss] = 1;
  111.         }
  112.         if (!used[u])
  113.             dfs_fin(u);
  114.     }
  115. }
  116.  
  117. int solve()
  118. {
  119.     int n, m;
  120.  
  121.     scanf("%d%d", &n, &m);
  122.     for (int i = 0; i < m; ++i)
  123.     {
  124.         scanf("%d%d", &x, &y);
  125.         g[x].push_back({y, i});
  126.         g[y].push_back({x, i});
  127.     }
  128.  
  129.     dfs(1, -1);
  130.     for (int i = 1; i <= n; ++i)
  131.     {
  132.         if (color[i])
  133.             continue;
  134.         col++;
  135.         dfs1(i);
  136.     }
  137.  
  138.     for (int i = 1; i <= n; ++i)
  139.     {
  140.         cnt[color[i]]++;
  141.         mx_cnt = max(mx_cnt, cnt[color[i]]);
  142.         w[color[i]] = i;
  143.         if (mx_cnt == cnt[color[i]])
  144.         {
  145.             cnt_nom = color[i];
  146.         }
  147.     }
  148.  
  149.     memset(used, 0, sizeof(used));
  150.     dfs_fin(w[cnt_nom]);
  151.  
  152.     sort(ans.begin(), ans.end());
  153.  
  154.     printf("%d\n", cnt[cnt_nom]);
  155.  
  156.     for (int i = 0; i < ans.size(); ++i)
  157.         printf("%d %d\n", ans[i].ss.ff, ans[i].ss.ss);
  158.  
  159.     return 0;
  160. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement