Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- typedef vector<int> vi;
- typedef pair<int, int> pii;
- #define ff first
- #define ss second
- #define y1 y111
- #define X first
- #define Y second
- #define mk make_pair
- #define inb push_back
- #define all(v) v.begin(), v.end()
- const int MAXN = (int)1e6 + 9, MAXN1 = (int)2e4 + 7;
- const int INFint = (int)1e9 + 7, P = 31;
- const ll INFll = (ll)1e18 + 7, MOD = (ll)1e9 + 7;
- const double INFfl = 1e18 * 4 + 7;
- const double EPS = 1e-7;
- const double PI = atan2(0, -1);
- vector < pair <int, int> > g[MAXN];
- int n, m, x, y, t, t_in[MAXN], up[MAXN], col, color[MAXN], mx_cnt, cnt_nom;
- int cnt[MAXN], w[MAXN];
- bool used[MAXN], in_ans[MAXN], most[MAXN];
- vector < pair < int, pair <int, int> > > ans;
- int solve();
- int main()
- {
- #define TASK ""
- #ifdef _DEBUG
- freopen("input.txt", "r", stdin), freopen("output.txt", "w", stdout);
- #else
- //freopen(TASK".in", "r", stdin), freopen(TASK".out", "w", stdout);
- #endif
- solve();
- }
- const int STRBUF = (int)1e6 + 7;
- char buf[STRBUF];
- string get_str()
- {
- scanf(" %s", buf);
- return string(buf);
- }
- void dfs (int v, int nom)
- {
- used[v] = 1;
- t++;
- t_in[v] = t;
- up[v] = t;
- for (int i = 0; i < g[v].size(); ++i)
- {
- if (nom == g[v][i].ss)
- continue;
- int u = g[v][i].ff;
- if (used[u])
- {
- up[v] = min(up[v], t_in[u]);
- continue;
- }
- dfs(u, g[v][i].ss);
- up[v] = min(up[v], up[u]);
- if (t_in[v] < up[u])
- {
- most[g[v][i].ss] = 1;
- }
- }
- }
- void dfs1(int v)
- {
- color[v] = col;
- for (int i = 0; i < g[v].size(); ++i)
- {
- if (!color[g[v][i].ff] && !most[g[v][i].ss])
- {
- //cout << col << ' ' << g[v][i].ff << ' ' << g[v][i].ss << '\n';
- dfs1(g[v][i].ff);
- }
- }
- }
- void dfs_fin (int v)
- {
- int u;
- used[v] = 1;
- for (int i = 0; i < g[v].size(); ++i)
- {
- u = g[v][i].ff;
- if (!in_ans[g[v][i].ss])
- {
- if (!most[g[v][i].ss])
- {
- ans.push_back({g[v][i].ss, {v, u}});
- }
- else
- {
- ans.push_back({g[v][i].ss, {u, v}});
- }
- in_ans[g[v][i].ss] = 1;
- }
- if (!used[u])
- dfs_fin(u);
- }
- }
- int solve()
- {
- int n, m;
- scanf("%d%d", &n, &m);
- for (int i = 0; i < m; ++i)
- {
- scanf("%d%d", &x, &y);
- g[x].push_back({y, i});
- g[y].push_back({x, i});
- }
- dfs(1, -1);
- for (int i = 1; i <= n; ++i)
- {
- if (color[i])
- continue;
- col++;
- dfs1(i);
- }
- for (int i = 1; i <= n; ++i)
- {
- cnt[color[i]]++;
- mx_cnt = max(mx_cnt, cnt[color[i]]);
- w[color[i]] = i;
- if (mx_cnt == cnt[color[i]])
- {
- cnt_nom = color[i];
- }
- }
- memset(used, 0, sizeof(used));
- dfs_fin(w[cnt_nom]);
- sort(ans.begin(), ans.end());
- printf("%d\n", cnt[cnt_nom]);
- for (int i = 0; i < ans.size(); ++i)
- printf("%d %d\n", ans[i].ss.ff, ans[i].ss.ss);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement