Вот упражнение:
Пусть v и w - две вершины в ориентированном графе G = (V, E). Разработайте алгоритм с линейным временем, чтобы найти количество различных кратчайших путей (не обязательно, если они не пересекаются) между v и w. Примечание: края в G невзвешены.
Для этого акциза я резюмирую следующее:
- Это ориентированный граф
- Он запрашивает количество различных кратчайших путей. Во-первых, пути должны быть кратчайшими, тогда может быть несколько таких кратчайших путей, длина которых одинакова.
- между v и w, поэтому следует учитывать как от v до w, так и от w до v.
- линейное время.
- Граф не взвешен.
Из вышеприведенных пунктов я имею следующие мысли:
- Мне не нужно использовать Dijkstras Algorithm, потому что график не взвешен, и мы пытаемся найти все кратчайшие пути, а не только один один.
- Я поддерживаю
count
для числа кратчайших путей - Я хотел бы сначала использовать BFS из v, а также поддерживать
global level
информацию - Я увеличиваю
global level
на каждый каждый раз, тогда BFS достигает нового уровня - Я также поддерживаю
shortest level
информацию для кратчайшего пути к w - В первый раз, когда я встречаю w во время путешествия, я назначаю
global level
shortest level
иcount++
; - пока
global level
равенshortest level
, я увеличиваюcount
каждый раз, когда я снова встречаюсь w. - если
global level
становится больше, чемshortest level
, я завершаю путешествие, потому что я ищу кратчайший путь, а не путь. - Затем я снова делаю 2 - 8 для w к v
Правильно ли мой алгоритм? Если я делаю v с w, а затем с w на v, это все еще считается линейным временем?