Поиск узла, который имеет наименьшее максимальное расстояние до всех других узлов в графе с использованием BFS?

58
6

Несколько дней назад я сделал эту функцию, чтобы найти диаметр графика с помощью BFS:

dist[v] = 0;
queue<int> next;
next.push(v);

int bdist = 0; //biggest distance
while(!next.empty()) {
int pos = next.front();
next.pop();
bdist = dist[pos];

for(int i = 0; i < graph[pos].size(); ++i) {
int nghbr = graph[pos][i];
if(dist[nghbr] > dist[pos]+1) {
dist[nghbr] = dist[pos]+1;
next.push(nghbr);
}
}
}

return bdist-1;
}

Как/что я могу изменить в коде, чтобы вместо того, чтобы возвращать диаметр, я вместо этого вернул узел с наименьшим максимальным расстоянием до всех остальных узлов? Как будет выглядеть новый код?

спросил(а) 2015-01-15T14:20:00+03:00 5 лет, 9 месяцев назад
1
Решение
57

В основном вы вызываете функцию most_dist для каждого узла (также я думаю, вы должны вернуть bdist not bdist-1). Таким образом, для каждого узла вы получаете расстояние от максимального узла от этого узла. Итак, вот псевдокод, чтобы получить узел с минимальным максимальным расстоянием

     /*g is your graph */
/* This code goes in your main */
/* assuming 0 based indexing of nodes */
answer = 0 /* stores your answer, let node 0 be the answer we will update it */
dis = biggest_dist(0,g) /* stores the maximum distances of node 0 */
for each node
maxdist = biggest_dist(node,g)
if maxdist < dis:
dis = maxdist
answer = node

print answer /* your answer */

Помните, что может быть более одного ответа, это печатает любой из них. Также, как было предложено другими, вы должны отредактировать свой вопрос, чтобы отразить ваши усилия.
РЕДАКТИРОВАТЬ
Этот алгоритм имеет сложность O (EV + V ^ 2). Если вы используете floyyd warshall для вычисления кратчайших расстояний между всеми, от которых вы легко получаете свой ответ, это будет O (V ^ 3), и с помощью dijakstra будет O (EV + V ^ 2logV). Теперь, как и в простом графе E, при max может быть V ^ 2, я бы пошел на алгоритм, данный вами, если мне нужно уменьшить временную сложность.

ответил(а) 2015-01-15T16:45:00+03:00 5 лет, 9 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема