Advertisement
savrasov

DEBUUUUUUUGV2

Jun 19th, 2017
348
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.58 KB | None | 0 0
  1. int d[300000], q[(int)(1e7 * 1.1)], h, t, pr[300000];
  2. vector<vector<pair<int, pair<bool, bool> > > > g(200001);// , g1(200001);
  3. vector<bool> debt(N), used(N);
  4. set<pair<int, int> > us;
  5.  
  6. int add(int a, int b)
  7. {
  8.     if (a == -1 || b == -1) return -1;
  9.     else return ((a + b) % mod);
  10. }
  11.  
  12. int main()
  13. {
  14.     d[0] = 1;
  15.     int n, m, a, b, v;
  16.     cin >> n >> m;
  17.     for (int i = 0; i < m; i++)
  18.     {
  19.         scanf("%d%d", &a, &b);
  20.         a--;
  21.         b--;
  22.         g[a].pb(mp(b, mp(0, 0)));
  23.         pr[b]++;
  24.     }
  25.     q[h++] = 0;
  26.     used[0] = 1;
  27.     for (; h != t;)
  28.     {
  29.         v = q[t++];
  30.         t %= md;
  31.         for (vector<pair<int, pair<bool, bool> > >::iterator i = g[v].begin(); i != g[v].end(); i++)
  32.         {
  33.             if (i->yy.xx)
  34.             {
  35.                 d[i->xx] = d[v] = pr[i->xx] = pr[v] = -1;
  36.                 debt[v] = 1;
  37.                 continue;
  38.             }
  39.             else i->yy.xx = 1;
  40.             if (pr[v] <= 0)
  41.             {
  42.                 d[i->xx] = add(d[i->xx], d[v]);
  43.                 pr[i->xx]--;
  44.                 //debt[v] = 1;
  45.                 if (!used[i->xx])
  46.                 {
  47.                     q[h++] = i->xx;
  48.                     h %= md;
  49.                     used[i->xx] = 1;
  50.                     debt[v] = 0;
  51.                 }
  52.             }
  53.             else
  54.             {
  55.                 debt[v] = 1;
  56.                 q[h++] = i->xx;
  57.                 h %= md;
  58.             }
  59.         }
  60.     }
  61.     h = t = 0;
  62.     q[h++] = 0;
  63.     used[0] = 1;
  64.     for (; h != t;)
  65.     {
  66.         v = q[t++];
  67.         t %= md;
  68.         if (pr[v] > 0)
  69.         {
  70.             q[h++] = v;
  71.             h %= md;
  72.             continue;
  73.         }
  74.         for (vector<pair<int, pair<bool, bool> > >::iterator i = g[v].begin(); i != g[v].end(); i++)
  75.         {
  76.             if (debt[v]) d[i->xx] = add(d[i->xx], d[v]), pr[i -> xx]--;
  77.             if (!(i->yy.yy))
  78.             {
  79.                 q[h++] = i->xx;
  80.                 h %= md;
  81.                 i->yy.yy = 1;
  82.                 pr[i->xx]--;
  83.             }
  84.         }
  85.         debt[v] = 0;
  86.     }
  87.     for (int i = 1; i < n; i++) printf("%d\n", d[i]);
  88.     return 0;
  89. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement