Идея: разрешаем пересадки по одной
Заводим квадратную таблицу: W[i][j] — кратчайший путь из i в j. Сначала в ней только сами рёбра, остальное бесконечность.
Дальше берём вершину k и разрешаем через неё ездить: если из i доехать до k, а потом из k до j дешевле, чем напрямую, — переписываем клетку.
Внешний цикл — по пересадкам, внутренние — по клеткам таблицы.
Перебрав так все вершины в роли k, получаем настоящие кратчайшие пути между всеми парами.
Почему порядок k не важен
После обработки очередной k в таблице лежат кратчайшие пути, которым разрешены пересадки в уже пройденных вершинах. Какая вершина окажется в этом наборе раньше, а какая позже, роли не играет — важно лишь, что каждая побывала снаружи ровно один раз.
Чего делать не нужно
Диагональ W[i][i] обнулять не обязательно: она участвует только там, где ничего не улучшает. И перенумеровывать вершины не нужно — таблица и так на 1001 строку.