Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- int d[300000], q[30000000], h, t, pr[300000];
- vector<vector<pair<int, pair<bool, bool> > > > g(200001);// , g1(200001);
- vector<bool> debt(N), used(N);
- set<pair<int, int> > us;
- int add(int a, int b)
- {
- if (a == -1 || b == -1) return -1;
- else return ((a + b) % mod);
- }
- int main()
- {
- d[0] = 1;
- int n, m, a, b, v;
- cin >> n >> m;
- for (int i = 0; i < m; i++)//начинается чтение графа
- {
- scanf("%d%d", &a, &b);
- a--;
- b--;
- g[a].pb(mp(b, mp(0, 0)));
- pr[b]++;//считаю предков этой вершины
- }//конец чтения графа
- q[h++] = 0;
- used[0] = 1;
- for (; h != t;)//пока очередь непуста
- {
- v = q[t++];
- t %= md;//не обращай внимания
- for (vector<pair<int, pair<bool, bool> > >::iterator i = g[v].begin(); i != g[v].end(); i++)//идем по дорогам, идущим из вершины
- {
- if (i->yy.xx)//если путь не юзался на первом этапе работы программы
- {
- d[i->xx] = d[v] = pr[i->xx] = pr[v] = -1;//делаем дистанцию до нее равной -1 и говорим, что инфа от остальных предков не нужна
- continue;
- }
- else i->yy.xx = 1;//иначе помечаем дорогу как пройденную на первом этапе
- if (pr[v] <= 0)//если все предки отчитались или оно -1, как повествует костыль чуть выше
- {
- d[i->xx] = add(d[i->xx], d[v]);//пересчитываем расстояние до соседа
- pr[i->xx]--;//уменьшаем количество неотчитавшихся предков
- if (!used[i->xx])//если вершина еще не была в очереди, то добавляем ее туда
- {
- q[h++] = i->xx;
- h %= md;
- used[i->xx] = 1;
- }
- debt[v] = 0;//говорим, что вершина никому ничего не должна
- }
- else
- {
- debt[v] = 1;//говорим, что должна
- q[h++] = i->xx;
- h %= md;
- }
- }
- }
- h = t = 0;//очищение очереди
- q[h++] = 0;
- used[0] = 1;
- for (; h != t;)
- {
- v = q[t++];
- t %= md;
- if (pr[v] > 0) continue;//если у нее есть неотчитавшиеся предки, то она нам пока не нужна
- for (vector<pair<int, pair<bool, bool> > >::iterator i = g[v].begin(); i != g[v].end(); i++)//идем по соседям
- {
- if (debt[v]) d[i->xx] = add(d[i->xx], d[v]);//если текущая вершина должна своим потомкам, то отдаем долг
- if (!(i->yy.yy))//если путь во второй раз не юзался, то юзаем его
- {
- q[h++] = i->xx;
- h %= md;
- i->yy.yy = 1;
- pr[i->xx]--;
- }
- }
- debt[v] = 0;// делаем вершину не должной никому
- }
- for (int i = 1; i < n; i++) printf("%d\n", d[i]);//вывод ответа
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement