Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <iostream>
- #include <vector>
- using namespace std;
- vector < vector<int> > g, gt;
- vector<char> used;
- vector<int> out;
- int k=0, n,m,comp[10000]={0};
- void dfs_g (int v) {
- used[v] = true;
- for (size_t i=0; i<g[v].size(); ++i)
- if (!used[ g[v][i] ]){
- dfs_g(g[v][i]);
- }
- out.push_back (v);
- }
- void dfs_gt (int v) {
- used[v] = true;
- comp[v]=k;
- for (size_t i=0; i<gt[v].size(); ++i)
- if (!used[ gt[v][i] ]){
- dfs_gt (gt[v][i]);
- }
- }
- int main() {
- FILE *f;
- //Считываем с файла данные
- f = freopen("input.txt", "r", stdin);
- fscanf(f, "%d %d", &n, &m);
- int u, v, i;
- g.resize(m+1);
- gt.resize(m+1);
- //Заполняем два графа: g-исходный, gt-транспонированный
- for (i = 0; i<m; i++)
- {
- fscanf(f, "%d %d", &u, &v);
- g[u-1].push_back(v-1);
- gt[v-1].push_back(u-1);
- }
- v = 0;
- used.assign (n, false);
- for (int i=0; i<n; ++i)
- if (!used[i])
- dfs_g (i);
- used.assign (n, false);
- for (int i=0; i<n; ++i) {
- int v = out[n-1-i];
- if (!used[v]) {
- dfs_gt (v);
- k++;
- }
- }
- freopen("output.txt", "w", stdout);
- printf("%d\n", k);
- for (i = 0; i<n; i++){
- printf("%d ", comp[i]+1);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement