Мой код является модифицированной версией алгоритма Дейкстры, который отслеживает количество различных кратчайших путей к каждому узлу из источника. Однако это не совсем правильно. Кто-нибудь знает, что такое правильный алгоритм?
Здесь pq - это приоритетная сортировка пар (pii) очередей расстояний и узлов, dis - это стандартный массив расстояний для кратчайшего пути, а пути [i] представляют количество кратчайших путей от начала до i.
fill(dis, dis+n+1, INT_MAX); dis[start] = 0; pq.push({dis[start], start}); ways[start] = 1;
while(!pq.empty())
{
pii cur = pq.top(); pq.pop(); if(cur.d > dis[cur.v]) continue;
for(pii next : adj[cur.v])
{
if(cur.d + next.d < dis[next.v])
{
dis[next.v] = cur.d + next.d; pq.push({dis[next.v], next.v});
ways[next.v] = ways[cur.v];
}
else if(cur.d + next.d == dis[next.v])
{
ways[next.v] += ways[cur.v];
}
}
}