Advertisement
Guest User

Untitled

a guest
Jan 17th, 2018
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.46 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <iostream>
  3. #include <vector>
  4.  
  5. using namespace std;
  6. vector < vector<int> > g, gt;
  7. vector<char> used;
  8. vector<int> out;
  9. int k=0, n,m,comp[10000]={0};
  10. void dfs_g (int v) {
  11. used[v] = true;
  12. for (size_t i=0; i<g[v].size(); ++i)
  13. if (!used[ g[v][i] ]){
  14. dfs_g(g[v][i]);
  15. }
  16. out.push_back (v);
  17.  
  18. }
  19.  
  20. void dfs_gt (int v) {
  21. used[v] = true;
  22. comp[v]=k;
  23. for (size_t i=0; i<gt[v].size(); ++i)
  24. if (!used[ gt[v][i] ]){
  25.  
  26. dfs_gt (gt[v][i]);
  27. }
  28. }
  29.  
  30. int main() {
  31. FILE *f;
  32.  
  33. //Считываем с файла данные
  34. f = freopen("input.txt", "r", stdin);
  35. fscanf(f, "%d %d", &n, &m);
  36. int u, v, i;
  37. g.resize(m+1);
  38. gt.resize(m+1);
  39. //Заполняем два графа: g-исходный, gt-транспонированный
  40. for (i = 0; i<m; i++)
  41. {
  42. fscanf(f, "%d %d", &u, &v);
  43. g[u-1].push_back(v-1);
  44. gt[v-1].push_back(u-1);
  45. }
  46. v = 0;
  47. used.assign (n, false);
  48. for (int i=0; i<n; ++i)
  49. if (!used[i])
  50. dfs_g (i);
  51.  
  52. used.assign (n, false);
  53. for (int i=0; i<n; ++i) {
  54. int v = out[n-1-i];
  55. if (!used[v]) {
  56. dfs_gt (v);
  57. k++;
  58. }
  59. }
  60. freopen("output.txt", "w", stdout);
  61. printf("%d\n", k);
  62. for (i = 0; i<n; i++){
  63. printf("%d ", comp[i]+1);
  64. }
  65. return 0;
  66.  
  67. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement