Восстановление весов

Рассмотрим любое ребро $$$(u,v)$$$ с весом $$$w$$$, пусть $$$d_u > d_v$$$.

Тогда вес каждого ребра должен принадлежать отрезку $$$[\max(1, d_v - d_u); l]$$$.

Кроме этого, для каждой вершины $$$v \neq 1$$$ должно существовать хотя бы одно такое ребро, что $$$d_u + w = d_v$$$.

Заметим, что если все эти условия соблюдены, то расстановка весов является корректной.

Рёбрам, соединяющим две вершины $$$u,v$$$ с равными $$$d_u = d_v$$$, можно поставить любой вес.

Остальные ребра ориентируем от меньших $$$d_u$$$ к большим.

Для каждой вершины расстановка весов рёбер, входящих в неё, является не зависимой от расстановки весов рёбер, входящих в другие вершины.

Таким образом, если $$$f(v)$$$ – число способов расставить веса рёбрам, входящим в $$$v$$$, корректно, то ответ равен $$$f(2) \cdot f(3) \cdot \ldots \cdot f(n)$$$.

Для фиксированной вершины сначала посчитаем число способов расставить веса рёбрам, входящим в эту вершину, чтобы веса лежали в необходимых отрезках. Это значение равно произведению длин отрезков возможных весов ребра по всем рёбрам.

Но в некоторых таких ситуациях реальное расстояние до $$$v$$$ будет больше $$$d_v$$$, а именно это в тех случаях, когда не существует ребра $$$(u,v)$$$ с весом $$$w$$$, что $$$d_u + w = d_v$$$. В этих случаях вес каждого ребра $$$u \to v$$$ строго больше $$$d_u - d_v$$$. Поэтому для таких «плохих» случаев количество находится аналогично, и затем его нужно вычесть из текущего значения.

Для рёбер с известными заранее весами достаточно проверить, что их вес лежит в необходимом интервале, в противном случае заменить текущий ответ на $$$0$$$.