Блог пользователя Lelby

Автор Lelby, 10 лет назад, По-русски

Подскажите, пожалуйста, как решить.

Дан неориентированный взвешенный граф. Вроде какой-то динамикой можно посчитать количество кратчайших путей из v в u для всех u, предварительно запустив дейкстру из v. Вроде это можно делать даже параллельно с дейкстрой как-то. Как именно? :)

Взято из задачи G отсюда: http://codeforces.com/gym/100371/attachments/download/2258/2014-zimnyaya-shkola-po-programmirovaniu-harkov-dyen-1-ye-kapun-vysshaya-liga-ru.pdf

  • Проголосовать: нравится
  • +3
  • Проголосовать: не нравится

»
10 лет назад, # |
  Проголосовать: нравится +14 Проголосовать: не нравится

Совсем просто же:

for (e : g[v]) {
	if (dist[v] + e.w < dist[e.to]) {
		dist[e.to] = dist[v] + e.w;
		paths[e.to] = paths[v];
	} else if (dist[v] + e.w == dist[e.to]) {
		paths[e.to] += paths[v];
	}
}

Стоит помнить, что при наличии ребер с нулевым весом количество кратчайших путей до некоторых вершин может быть бесконечным.

  • »
    »
    10 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

    Спасибо:) Я почему-то всё пытался запихать, где в обоих случаях было

    paths[e.to] += paths[v];
    

    (вместо просто "равно")

»
5 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

А можно ли посчитать количество с помощью Флойда-Уоршелла?