Advertisement
Guest User

network

a guest
Jul 11th, 2012
189
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.53 KB | None | 0 0
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <cmath>
  4. #include <cstring>
  5. #include <cstdlib>
  6. #include <string>
  7. #include <vector>
  8. #include <cstdio>
  9.  
  10. using namespace std;
  11.  
  12. typedef long long ll;
  13. typedef long double ld;
  14.  
  15. #ifdef WIN32
  16.     #define LLD "%I64d"
  17. #else
  18.     #define LLD "%lld"
  19. #endif
  20.  
  21. const int maxn=100005;
  22.  
  23. int was[maxn];
  24. int kanswer=-1;
  25. int ans[maxn];
  26. vector<int> gr1[maxn],gr2[maxn];
  27. int ansc[maxn];
  28. int beg[maxn],end[maxn];
  29. int lcmp[maxn];
  30. int ttime[maxn];
  31. int comp[maxn];
  32. int n,m,root,timer;
  33. bool in[maxn];
  34. int r[maxn];
  35. int answer1[maxn],answer2[maxn];
  36.  
  37. void go1(int cur)
  38. {
  39.     if (was[cur]==1) return;
  40.     was[cur]=1;
  41.     for (int i=0;i<gr1[cur].size();i++) go1(gr1[cur][i]);
  42.     ttime[++timer]=cur;
  43. }
  44.  
  45. void go2(int cur,int cmp)
  46. {
  47.     if (was[cur]==1) return;
  48.     was[cur]=1;
  49.     for (int i=0;i<gr2[cur].size();i++) go2(gr2[cur][i],cmp);
  50.     comp[cur]=cmp;
  51.     lcmp[++end[cmp]]=cur;
  52. }
  53.  
  54. int main()
  55. {
  56.     int startt=clock();
  57.     scanf("%d%d%d",&n,&m,&root),root--;
  58.     for (int i=0;i<m;i++)
  59.     {
  60.         int a,b;
  61.         scanf("%d%d",&a,&b),a--,b--;
  62.         gr1[a].push_back(b);
  63.         gr2[b].push_back(a);
  64.     }
  65. //  if (n<=10000) solveslow();
  66. //  memset(was,0,sizeof(was));
  67.     timer=-1;
  68.     go1(root);
  69.     memset(was,0,sizeof(was));
  70.     int kv=0;
  71.     end[0]=-1;
  72.     for (int i=0;i<n;i++) if (was[ttime[n-i-1]]==0)
  73.     {
  74.         go2(ttime[n-i-1],kv++);
  75.         end[kv]=end[kv-1];
  76.         end[kv-1]++;
  77.         beg[kv]=end[kv-1];
  78.     }
  79. //  memset(ansc,0,sizeof(ansc));
  80.     for (int i=kv-1;i>=0;i--)
  81.     {
  82.         for (int u=beg[i];u<end[i];u++)
  83.         {
  84.             int v=lcmp[u];
  85.             for (int j=0;j<gr1[v].size();j++) if (comp[gr1[v][j]]!=i)
  86.             {
  87.                 ansc[i]+=ansc[comp[gr1[v][j]]];
  88.             }
  89.         }
  90.         ansc[i]+=end[i]-beg[i];
  91.     }
  92.     for (int i=0;i<n;i++) ans[i]=ansc[comp[i]];
  93.     for (int i=0;i<n;i++) printf("%d ",ans[i]);
  94.     printf("\n");
  95.     for (int i=kv-1;i>=0;i--)
  96.     {
  97.         for (int u=beg[i];u<end[i];u++)
  98.         {
  99.             int v=lcmp[u];
  100.             for (int j=0;j<gr1[v].size();j++) if (comp[gr1[v][j]]!=i)
  101.             {
  102.                 in[gr1[v][j]]=true;
  103.             }
  104.         }
  105.     }
  106.     in[root]=true;
  107.     for (int i=0;i<n;i++) r[i]=i;
  108.     for (int i=kv-1;i>=0;i--)
  109.     {
  110.         for (int u=beg[i];u<end[i];u++)
  111.         {
  112.             int v=lcmp[u];
  113.             for (int j=0;j<gr1[v].size();j++) if (comp[gr1[v][j]]!=i)
  114.             {
  115.                 if (in[v])
  116.                 {
  117.                     if (r[v]==v) r[v]=r[gr1[v][j]];
  118.                     else answer1[++kanswer]=r[gr1[v][j]],answer2[kanswer]=v;
  119.                 } else answer1[++kanswer]=r[gr1[v][j]],answer2[kanswer]=v;
  120.             }
  121.         }
  122.     }
  123.     if (r[root]!=root) answer1[++kanswer]=r[root],answer2[kanswer]=root;
  124.     printf("%d\n",kanswer+1);
  125.     for (int i=0;i<kanswer+1;i++) printf("%d %d\n",answer1[i]+1,answer2[i]+1);
  126.     return 0;
  127. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement