ああZaban、自分自身のビット演算は、すべてのああではないが、兄と兄カンカンの部屋は私にコードを語ってみましょうする必要がありました
コード:
1つの#include <ビット/ STDC ++ H.> 2 使用して 名前空間STD; 3 CONST INT N = 1E6 + 7 ; 4 のconst int型 INF = 0x3f3f3f3f ; 5 int型N-、M; 6 INT G [N]; // G [I]私はポイントは全ての点に到達することができ表し 7。 INT DP [N] [ 21である ]; // DP [I] [k]はiが到達ステップkを費やして行くために状態を表す 。8つの int型の DISを[ 21れる ] [ 21である ]; // 保存側面 9 INT メイン(){ 10 scanfの(" %D%D "、およびN-、&)M; 11 のmemset(DISは、は0x3F、はsizeof DIS); 12である ため(INT I = 1 ; I <= M; I ++ ){ 13は int型U、V、W; 14 scanfの(" %D%D%D "、&U、V&、&W)、 15 U - 、V - ; // ここで-位置計算は、より便利であろう後以降 16の DIS [U] [V ] = DIS [V] [U] =分(DIS [U] [V]、W); // 複数のエッジを有する 。17 } 18は、 INTすべて=(1 << N-) -。1 ; 19 用(INT I = 1 ; I <=すべて; I ++){ // すべての状態列挙 20がある ため(INT J = 0 ; J <N-; J ++){ // すべての点を列挙 21は、 IF((1。 J <<)&I){ // I J含む状態ならば 22である DIS [J] [J] = 0 ; // 初期自身0〜 23である ため(int型 K = 0 ; K <N-; K ++ ){ 24 IF(DIS [J] [K]!= INF){ 25 Gは、[I] | =(1 << K)は、// 達することができるすべてのタグ 26である } 27 } 28 } 29 } 30 } 31である のmemset(DP、は0x3F、はsizeof DP); 32 用(INT I = 0。 I <N - 、I ++ ){ 33は、 DP [ 1。 [<< I] 0 ] = 0 ; // 時間がかかることはない費やさ0〜 34である } 35 のために(INT= I 2、I <=すべて; I ++){ // ために独自の開始からすべての状態、2を列挙し、そしてのみ空集合に関係なく、 36 のために(INT J = I - 1 ; J; J =( J - 1。 )&I){ // 列挙サブセットの状態のI 37 [ IF((G [j] | I)== G [J]){ // I jは、状態に到達するために場合 38である INT SUM = 0 。 39 INT残りJ ^ = I; // 削除残りのポイントにされていない 40 のために(INT K = 0 ; K <N-; K ++){ // すべてのエンドポイントを列挙 41である IF((1 << K)およびレクリエーション){ //それは上に休ましない場合ポイント 42は、 INT TMP = INF; 43である ため(INT H = 0 ; H <N-; H ++){ // 列挙点開始 44は、 IF((1 << H)&J){ / / 状態の点jの場合 45 TMP分=(TMP、DIS [H] [K]); // 更新プログラム 46である } 47 } 48 SUM + = TMP; // iが状態jに状態から総最小コストを計算 49 } 50 } 51である ため(整数 K = 1 ; K <N-; Kは++ ){ 52が IF(DP [J] - [K 1。 == INF)] 続行 ; // 前スキップ到達しない 53である DP [I] [K] =分( DP [I] [K]、DP [J] [K - 1 ] + SUM * K); // 更新プログラム 54である } 55 } 56である } 57である } 58 INT ANS = INF; 59 用(INT I = 0 ; I < N-; I ++ ){ 60 ANS =分(ANS、DP [すべて] [I]); //検索の最小値 61である } 62である のprintf(" %D \ N- " 、ANS); 63が リターン 0 ; 64 }
いいえ、燃料補給!