Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstdio>
- #include <vector>
- #include <algorithm>
- #include <queue>
- using namespace std;
- #define FILE "bicone"
- vector <vector <int > > g;
- vector <bool> used;
- vector <int> color;
- vector <int> ret, enter;
- int timer = 0;
- bool FLAG = false;
- int maxcolor = 0;
- void dfs(int v, int p) {
- used[v] = true;
- enter[v] = ret[v] = timer++;
- for(int i = 0; i < g[v].size(); ++i) {
- int to = g[v][i];
- if(to == p) continue;
- if(used[to])
- ret[v] = min(enter[to], ret[v]);
- else {
- dfs(to, v);
- ret[v] = min(ret[to], ret[v]);
- }
- }
- }
- void paint(int v, int v_color) {
- color[v] = v_color;
- for(int i = 0; i < g[v].size(); ++i) {
- int to = g[v][i];
- if(color[to] == -1) {
- if(ret[to] == enter[to]) {
- maxcolor++;
- paint(to, maxcolor);
- }
- else paint(to, v_color);
- }
- }
- }
- int main() {
- freopen(FILE".in", "r", stdin);
- freopen(FILE".out", "w", stdout);
- int n, m, a, b;
- cin >> n >> m;
- g.resize(n);
- color.resize(n, -1);
- used.resize(n, false);
- enter.resize(n, 0);
- ret.resize(n, 0);
- for(int i = 0; i < m; ++i) {
- cin >> a >> b;
- --a; --b;
- g[a].push_back(b);
- g[b].push_back(a);
- }
- timer = 0;
- for(int i = 0; i < n; ++i)
- if(!used[i])
- dfs(i, -1);
- for(int i = 0; i < n; ++i) {
- if(color[i] == -1) {
- maxcolor++;
- paint(i, maxcolor);
- }
- }
- cout << maxcolor << endl;
- for(int i = 0; i < n; ++i)
- cout << color[i] << " ";
- return 0;
- }
Add Comment
Please, Sign In to add comment