最短経路を解決するためのバックトラック

次のような問題を解決するためのバックトラックを使用します

質問:販売商品、都市間の既知の距離に都市の数にセールスマン。彼は再び、各都市の後、住民から選ばれ、そして最終的に戻って駅のルートへの総距離(または総旅費)を最小限に抑えます。以下5以上の都市の数。

 

 

書式#include <iostreamの>
 使用して 名前空間はstdを、

const  int型 INF = 10000000 ;
整数 nは、CC = 0、bestc = INF。
int型 ** グラム。
int型 * X、* bestx。

ボイド旅行(INT T){
     もし(T == N){
         場合(G [X [T - 1 ] [X [T] = INF && G [X [T] [!1 ] = INF &&!
            (CC + G [X [T - 1 ] [X [T] + G [X [T] [ 1 ] <bestc || bestc == INF)){
             int型私は= 0をI <N + 1I ++ 
                bestx [I] = X [i]は、
            bestc = CC + G [X [T - 1 ] [X [T] + G [X [T] [ 1 ]。
        } 
        を返します
    } 

    のためのINT I = T; I <N; I ++ ){
         場合(G [X [T - 1 ] [X [I] = INF &&(CC + G [X [T! - 1 ] [X [I] < bestc
             || bestc == INF)){ 
            スワップ(X [i]は、X [T])。
            CC + = G [X [T - 1 ] [X [T]]。 
            旅行(T+ 1 )。
            CC - = G [X [T - 1 ] [X [T]]。
            スワップ(X [i]は、X [T])。
        } 
    } 
} 

ボイド出力(){ 
    COUT << " 最短路程为:" << "  " 
    coutの << << bestc てendl; 
    裁判所未満 << " 最优路径为:" << "  " ; 
    COUT << bestx [ 1 ]。
    以下のためにINT iが= 2 ; iが< N + 1I ++  
        COUT << "  " << bestx [I]; 
    COUT << "  " << bestx [ 1 ] << ENDL; 
} 

int型(メイン){ 

    N = 4 ; //の数を設定N都市の4。 
    G = 新しい新 INT * [N- + 1 ]; // Gは、ストレージパスの配列によって表される 
    X = 新しい新しい INT [N- + 1 ]; 
    bestx = 新しい新しい INT [N- + 1 ]; 

    のためのINT I = 0; I <N + 1I ++ ){ 
        G [I] = 新しい INT [N + 1 ]。
        X [i]は = I。

        INT J = 0 ; J <N + 1、J ++ 
            G [I] [J] = INF。
    } 

    G [ 1 ] [ 2 ] = G [ 2 ] [ 1 ] = 30// 1 < - > 2之间距离 
    G [ 1 ] [ 3 ] = G [ 3 ] [ 1 ] = 6; 
    G [ 1 ] [ 4 ] = G [ 4 ] [ 1 ] = 4 

    G [ 2 ] [ 3 ] = G [ 3 ] [ 2 ] = 5 
    G [ 2 ] [ 4 ] = G [ 4 ] [ 2 ] = 10 

    G [ 3 ] [ 4 ] = G [ 4 ] [ 3 ] = 20 

    旅行(2 ); 
    出力(); 
    システム(一時停止);
    リターン 0 ; 
}

おすすめ

転載: www.cnblogs.com/wxh-blos/p/12093432.html