1204Cアンナ、Svyatoslavと地図

効果の対象に

あなたのマップへのパスを与えます

あなたはできるだけ等しいとして少しポイントを選択することができますように与えられたパス内の最短の長さの新しいパスと元のパス

指定されたパス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 ; 
}

おすすめ

転載: www.cnblogs.com/yzxverygood/p/11415181.html