С учетом эффекта
Дайте вам карту и путь к
Позволяет выбрать точку равно как можно меньше, так что новый путь кратчайшей длины и оригинальный путь в данном пути
Расстояние между двумя точками рядом с заданной траекторией 1
анализ
Флойд первым найти кратчайший путь между двумя точками
После каждой точки я, чтобы найти все самое короткое расстояние говорит = расстояние, чтобы построить точку J в последовательности
Дп [I] передается дп [J], чтобы
код
#include <iostream>
#include <cstdio>
#include <CString>
#include < строка >
#include <алгоритм>
#include <cctype>
#include <CMATH>
#include <cstdlib>
#include <очереди>
#include <CTime>
# include <вектор>
#include < установлен >
#include <карта>
#include <стек>
используя пространство имен станд;
INT d [ 110 ] [ 110 ],], п, т, дп [ 1001000 ], ла [ 1001000 ], а [ 1001000 ], CNT, ANS [ 1001000 ];
символ с [ 110 ];
INT основных () {
Int I, J, K;
зсапЕ ( " % d " , & п);
MemSet (д, 0x3f , SizeOf (г));
для (я = 1 ; г <= п; я ++ ) {
зсапЕ ( " % s " , s + 1 );
для (J = 1 , J = <N; j ++ )
г [I] [J] = S [J] -' 0 ' ;
}
Для (я = 1 ; г <= п; я ++ )
для (J = 1 , J <= N; j ++ )
, если (г [я] [J]) D [I] [J] = г [I] [ J];
для (к = 1 , K <= N; K ++ )
для (я = 1 ; г <= п; я ++ )
для (J = 1 , J <= N; j ++) , если (! я = к)
д [I] [J] = мин (D [I] [J], D [I] [K] + d [K] [J]);
зсапЕ ( " % d " , & м);
для (я = 1; я <= т; я ++) Scanf ( " % D " , & в [I]);
MemSet (дп, 0x3f , SizeOf (др));
дп [ 1 ] = 1 ;
для (я = 1 ; я <= т; я ++ ) {
J = я;
в то время как (J + 1 <= т && д [а [я]] [а [J + 1 ]] == J-I + 1 ) {
J ++ ;
если (дп [I] + 1 < дп [J]) {
дп [J] = дп [I] + 1 ;
ла [J] = I;
}
}
}
Е ( " % d \ п " , дп [м]);
INT х = м;
в то время как (х) {
ANS [ ++ CNT] = А [х];
х = ла [х];
}
Для (I = CNT, я> 0 ; я -) Е ( " % D " , анс [I]);
ставит ( "" );
вернуться 0 ;
}