Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- ЗАПУСКАЕМ
- ░░◐░░◐░░░ХАЧИКУДЖИ░░░░░░░░░
- ░░▐░░▌░░░░░░▄▄▄▄░░░░░░░░░░░
- ░░▐░░▌░░░▄▀▀░▄▄▄▀▀▄░░░░░░░░
- ░░▐▄▄▌░▐▀░▐▀▀░▄░▀▌░▀▌░░░░░░
- ░▐░░░░▀▐░▐░░░▄▄▌░░▌░▀▌░░░░░
- ░░▀▌░░░▐▄░▀▀▀░░░▄▄▌░▄▌░░░░░
- ░░░░▀▄░░░▐▄▄▄▀▀▀░░▄▀░░░░░░░
- ░░░░░░▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀░░░░░
- */
- #pragma GCC optimize("Ofast,unroll-loops")
- #pragma GCC target("avx,avx2,fma,sse4")
- #pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,unswitch-loops,fast-math")
- #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,avx2,tune=native")
- #include <iostream>
- #include <string>
- #include <sstream>
- #include <cmath>
- #include <memory.h>
- #include <algorithm>
- #include <stack>
- #include <deque>
- #include <iomanip>
- #include <stdio.h>
- #include <queue>
- #include <map>
- #include <set>
- #include <unordered_map>
- #include <unordered_set>
- #include <random>
- #include <ctime>
- #include <cstdlib>
- #include <cassert>
- #include <iterator>
- #include <chrono>
- #include <array>
- #include <bitset>
- //#define int long long
- #define itn long long
- #define fro for
- #define intt __int128
- #define pii pair <int, int>
- #define debug(x) cerr << (#x) << " " << (x) << endl
- #define pb push_back
- #define all(vc) vc.begin(), vc.end()
- #define fir first
- #define sec second
- #define endl "\n"
- #define un unsigned
- #define INF 1000000010
- #define EPS 0.0000000001
- #define double long double
- using namespace std;
- const int N = 200005, R = 1 << 20, MOD = 1e9 + 7, ABC = 26, logn = 20;
- const int BUBEN = 1001;
- const double PI = acos(-1);
- mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count());
- map<pii, int> num;
- map<pii, int> mp;
- int up[N], d[N];
- vector<bool> used(N);
- bool art_point[N];
- void dfs(vector<vector<int>>& gr, int v, int p = -1) {
- used[v] = 1;
- if (p != -1)
- d[v] = d[p] + 1;
- else
- d[v] = 1;
- up[v] = d[v];
- int cnt = 0;
- for (int i : gr[v]) {
- if (!used[i]) {
- cnt++;
- dfs(gr, i, v);
- up[v] = min(up[i], up[v]);
- if (up[i] >= d[v] && p != -1) {
- art_point[v] = 1;
- }
- }
- else if (i != v) {
- up[v] = min(up[v], d[i]);
- }
- }
- if (p == -1 && cnt > 1)
- art_point[v] = 1;
- }
- int color[N];
- int mxcolor = 0;
- map<pii, int>suka;
- void dfs2(vector<vector<int>>& gr, int v, int p, int cur) {
- used[v] = 1;
- for (int u : gr[v]) {
- if (p == u)
- continue;
- if (!used[u]) {
- if (art_point[v] && up[u] >= d[v]) {
- mxcolor++;
- suka[{u, v}] = mxcolor;
- suka[{v, u}] = mxcolor;
- dfs2(gr, u, v, mxcolor);
- }
- else {
- suka[{u, v}] = cur;
- suka[{v,u}] = cur;
- dfs2(gr, u, v, cur);
- }
- }
- if (d[u] < d[v]) {
- suka[{u, v}] = cur;
- suka[{v, u}] = cur;
- }
- }
- }
- bool cmp(set<int>& a, set<int>& b) {
- if (a.size() > 0)
- if (b.size() > 0)
- return *a.begin() < *b.begin();
- else
- return 1;
- else
- return 0;
- }
- signed main() {
- ios_base::sync_with_stdio(0);
- cin.tie(0);
- cout.tie(0);
- srand(time(0));
- cout.precision(17);
- int n, m;
- cin >> n >> m;
- vector<vector<int>> gr(n + 1);
- vector<pii> kok(m + 1);
- for (int i = 0; i < m; i++) {
- int a, b;
- cin >> a >> b;
- gr[a].push_back(b);
- gr[b].push_back(a);
- mp[{a, b}]++;
- mp[{b, a}]++;
- num[{a, b}] = i + 1;
- num[{b, a}] = i + 1;
- kok[i+1] = { a, b };
- }
- fro(int i = 1; i <= n; i++)
- if (!used[i])
- dfs(gr, i, i);
- used.assign(n + 1, 0);
- for (int i = 1; i <= n; i++)
- if (!used[i]) {
- mxcolor++;
- dfs2(gr, i, -1, mxcolor);
- }
- vector<set<int>> lol(n + 1);
- for (int i = 1; i <= m; i++) {
- lol[suka[kok[i]]].insert(i);
- }
- sort(all(lol), cmp);
- int cntt = 0;
- for (int i = 0; i < lol.size(); i++)
- if (lol[i].size() > 0)
- cntt++;
- for (int i = 0; i <= n; i++)
- for (int j : lol[i])
- color[j] = i + 1;
- cout << cntt << endl;
- for (int i = 1; i <= m; i++)
- cout << color[i] << " ";
- return 0;
- }
- /*
- 5 5
- 1 2
- 1 2
- 2 3
- 3 4
- 3 4
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement