Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <stdio.h>
- #include <math.h>
- #include <stdlib.h>
- #include <vector>
- using namespace std;
- const int mx = 200001;
- bool color[mx];
- int N, M, timer, in[mx], up[mx], count, head, clr[mx], maxcolor;
- vector<int> rebr[mx];
- vector<int> rebr_number[mx];
- vector<int> stash;
- void dfs(int v, int p)
- {
- color[v] = true;
- timer++;
- in[v] = timer - 1;
- up[v] = timer - 1;
- for (int i = 0; i < rebr[v].size(); i++)
- {
- if (clr[rebr_number[v][i]] == 0)
- stash.push_back(rebr_number[v][i]);
- int to = rebr[v][i];
- if (to == p)
- continue;
- if (color[to])
- {
- if (up[v] > in[to])
- up[v] = in[to];
- }
- else
- {
- if (v == head)
- count++;
- dfs(to, v);
- up[v] = min(up[v], up[to]);
- if (up[to] >= in[v])
- {
- maxcolor++;
- int temp = 0;
- while ( (stash.back() != rebr_number[v][i]) || (temp < 1) )
- {
- if (stash.back() == rebr_number[v][i])
- temp++;
- clr[stash.back()] = maxcolor;
- stash.pop_back();
- }
- clr[rebr_number[v][i]] = maxcolor;
- stash.pop_back();
- }
- else if (up[to] < up[v])
- up[v] = up[to];
- }
- }
- }
- int main()
- {
- freopen("biconv.in","r",stdin);
- freopen("biconv.out","w",stdout);
- int M;
- scanf("%d %d\n", &N, &M);
- for(int i = 0; i < mx; i++)
- {
- color[i] = false;
- clr[i] = 0;
- }
- for(int i = 0; i < M; i++)
- {
- int a, b;
- scanf("%d %d\n", &a, &b);
- rebr[a].push_back( b);
- rebr[b].push_back( a);
- rebr_number[a].push_back(i + 1);
- rebr_number[b].push_back(i + 1);
- }
- maxcolor = 0;
- for(int i = 1; i <= N; i++)
- {
- timer = 0;
- head = i;
- count = 0;
- if (!color[i])
- dfs(i, -1);
- }
- printf("%d\n", maxcolor);
- for(int i = 1; i <= M; i++)
- printf("%d ", clr[i]);
- fclose(stdin);
- fclose(stdout);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement