質問の意味:開始点を与えられた所定の20個の主要都市に隣接する3点、(他のすべての都市とした後、その領域に戻る)、次に、すべての出力経路(及び辞書最小)
アイデア:DFSのパスを見つけます、その後、最初の行に対応する辞書最小は、各都市、都市の一次配列に接続されています。
完全なコード:
#include <iostreamの> する#include <cstdioを> する#include <アルゴリズム> の#include <CStringの> 使用して 名前空間STD; INT G [ 25 ] [ 5 ]; int型 TOT; //は、パスの数を記録し、i番目のポイントに到達 INT ANSを[ 25 ]; int型 VISを[ 25 ]; int型の M; // 開始点 空隙 DFS(int型 S、int型CNT){ IF(CNT> 19)リターン ; // 終了 //从S开始的步骤为CNT结束 ため(int型 i = 0 ; iは< 3 ; I ++ ){ 場合(CNT == 19 && G [S] [I] == M){ COUT << ++ TOT << 」。" ; 以下のために(int型 i = 0 ; iは= < 19 ; I ++ ){ COUTを << " " << ANS [I]を、 } COUT << " " << M << ENDL。 返します。 IF(VIS [G [S] [I]] =!1。){ // 次の位置にアクセスしない ANS [CNT + 1 ] = G [S] [I]; VIS [G [S] [I] = 1 ; DFS(G [S] [I]、CNT + 1 ); VIS [G [S] [I] = 0 ; // バック } } } int型のmain(){ int型のS [ 3 ]; // 入力 のために(INT I = 1 ;私は= < 20であり、Iは++ ){ CIN >> S [0 ] >> S [ 1 ] >> S [ 2 ]。 ソート(S、S + 3 )。 G [i]が[ 0 ] =のS [ 0 ]。 G [i]が[ 1 ] = sの[ 1 ]。 G [i]は[ 2 ] = sの[ 2 ]。 } int型のS。 しばらく(CIN >> S){ 場合(!S)ブレーク。 TOT = 0 ; memsetの(VIS、0、はsizeof (VIS))。 M = Sを、VIS [M] = 1。// 後の最初の記録決意VIS ANS [ 0 ] = M; DFS(S、0 ); } 戻り 0 ; }