HDU - 2181ハミルトンは世界の問題(BFS)をバイパス

質問の意味:開始点を与えられた所定の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 ; 
}

 

おすすめ

転載: www.cnblogs.com/Tianwell/p/11265608.html