Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <fstream>
- #include <cmath>
- #include <vector>
- #include <algorithm>
- #include <list>
- using namespace std;
- ifstream cin("input.txt");
- ofstream cout("output.txt");
- //ifstream cin(" firesafe.in");
- //ofstream cout("firesafe.out");
- vector < list <int> > g, gt, scc;
- vector < bool > used;
- vector < vector < int > > c;
- vector < int > order, res, color;
- int n, m;
- void init(){
- used.resize(n);
- g.resize(n);
- gt.resize(n);
- c.resize(n);
- color.resize(n);
- for (int i = 0; i < n; i++)
- c[i].resize(n);
- }
- void dfs(int v){
- int j;
- list < int >:: iterator it;
- used[v] = true;
- for (it = g[v].begin(); it != g[v].end(); it++){
- j = *it;
- if (!used[j])
- dfs(j);
- }
- order.push_back(v);
- }
- void dfs1(int v){
- int j;
- list < int >:: iterator it;
- list < int >:: iterator jt;
- used[v] = true;
- scc[scc.size() - 1].push_back(v);
- for (it = gt[v].begin(); it != gt[v].end(); it++){
- j = *it;
- if (!used[j])
- dfs1(j);
- }
- }
- void bingo(int v){
- res.push_back(v);
- }
- void dfs2(int v){
- used[v] = true;
- bool children = false;
- for (int i = 0; i < scc.size(); i++)
- if (!used[i] && c[scc[v].front()][scc[i].front()] == 1){
- dfs2(i);
- children = true;
- }
- if (!children)
- bingo(scc[v].front());
- }
- int main() {
- cin >> n >> m;
- init();
- for (int i = 0; i < m; i++){
- int v, u;
- cin >> v >> u;
- g[v - 1].push_back(u - 1);
- gt[u - 1].push_back(v - 1);
- }
- for (int i = 0; i < n; i++)
- if (!used[i])
- dfs(i);
- used.assign(n, false);
- for (int i = n - 1; i >= 0; i--)
- if (!used[order[i]]){
- list < int >:: iterator it;
- list < int >:: iterator jt;
- scc.resize(scc.size() + 1);
- dfs1(order[i]);
- for (it = scc[scc.size() - 1].begin(); it != scc[scc.size() - 1].end(); it++)
- color[*it] = scc.size();
- }
- cout << scc.size() << endl;
- for (int i = 0; i< n; i++)
- cout << color[i] << " ";
- return 0;
- }
Add Comment
Please, Sign In to add comment