NOIP2017トレジャー

Luogu3959

ああ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 }
コードの表示

いいえ、燃料補給!

おすすめ

転載: www.cnblogs.com/Sundial/p/11842563.html