効果の対象に
あなたのマップへのパスを与えます
あなたはできるだけ等しいとして少しポイントを選択することができますように与えられたパス内の最短の長さの新しいパスと元のパス
指定されたパス1に隣接する2点間の距離
分析
フロイドは、最初の2点間の最短経路を見つけます。
各ポイントの後、私は、シーケンス内の点jを構築するために、すべての最短距離が言っている=距離を見つけるために
DP [i]はに[j]をDPに転送されます
コード
書式#include <iostreamの>
の#include <cstdioを>
する#include <CStringの>
の#include < 文字列 >
の#include <アルゴリズム>
書式#include <CCTYPE>
書式#include <cmath>
の#include <cstdlib>
書式#include <キュー>
の#include <CTIME>
#include <ベクトル>
の#include < 設定 >
の#include <地図>
の#include <積層>
使用して 名前空間STD。
int型の D [ 110 ] [ 110 ]、]、N、M、DP [ 1001000 ]、ラ[ 1001000 ]、[ 1001000 ]、CNT、ANS [ 1001000 ]。
チャー S [ 110 ]。
INT のmain(){
int型I、J、K。
scanf関数(" %のD "、&N)
memsetの(D、0x3fを、はsizeof (d)参照)。
用(i = 1 ; iが<= N; iは++ ){
scanf関数(" %sの"、S + 1 )。
用(J = 1 ; J <= N J ++ )
G [I] [J] - = S [J]' 0 ' ;
}
ため(i = 1 ; iが<= N; iは++ )
のために(J = 1 ; J <= N; J ++ )
場合(G [I] [J])D [i]は[J] = G [i]は[ J];
用(K = 1 k個++; kは<= N )
のための(i = 1 ; iが<= N; iが++ )
のために(J = 1 ; J <= N; J ++)場合(!I = J)
D [i]は[J] =分(D [i]は[J]、D [i]は[K] + D [k]は[J])。
scanf関数(" %のD "、&M)。
以下のための(I = 1; I <= M; iは++)のscanf(" %dの"、および[I])。
memsetの(DP、0x3fを、はsizeof (DP))。
DP [ 1 ] = 1 。
用(i = 1 ; iが<= M; iは++ ){
J = I。
一方、(J + 1 <= M && D [I] [J + 1 ]] == J-I + 1 ){
J ++ 。
場合(DP [I] + 1 < DP [J]){
DP [j]は DPを= [I] + 1 。
ラ[J] = I;
}
}
}
のprintf(" %d個の\ n " 、DP [M])。
INT X = M。
しながら(X){
ANS [ ++ CNTは] = [X]を。
X = [X]ラ。
}
のための(I = CNT; I> 0 ; I - )のprintf(" %dの" 、ANS [I])。
プット("" );
リターン 0 ;
}