次のような問題を解決するためのバックトラックを使用します
質問:販売商品、都市間の既知の距離に都市の数にセールスマン。彼は再び、各都市の後、住民から選ばれ、そして最終的に戻って駅のルートへの総距離(または総旅費)を最小限に抑えます。以下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 + 1。I ++ ) 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 + 1。I ++ ) 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 + 1。I ++ ){ 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 ; }