URL:https://www.acwing.com/problem/content/93/
ソリューション:
圧力のような暴力列挙アップデート後。$ Dpを[I] [J] $ $ I $位置1に2進数を表す点の位置が通過可能であり、$ jの$は現在のポイントです。伝達方程式は、$ DP [I] [J] =分である(DP [I]、[J]、DP [K] + DIS [K] [j] [iがoplus(1 << J)\])ここで、$を$ iがoplus(1 << J)$ $ I $ $ J $のバイナリ状態は、エッジを削除、すなわち状態から直接側から$ K $ $ $ J緩和に$ $ Jに接続されていない、そして最終的には\しますだけうまく列挙したものの側を決定。あなたが圧力を好きではない場合、それはTLE $を$ます。
ACコード:
#include <ビット/ STDC ++ H> 名前空間STDを使用して、 INT MP [20] [20]。 [1 << 20] [20] F INT。 INT解く(int型N) { memsetの(F、0x3f3f3f3f、はsizeof(F))。 F [1] [0] = 0。 (; I <(1 << N)++ I I = 1 INT)のため のために(++ J INT J = 0; J <N) IF((I >> J)&1) (INT kに対して= 0; K <N; ++ K) IF(((I ^(1 << J))>> K)&1) F [I] [J] =分(F [I] [J]、F [I ^(1 << J)] [K] + MP [K] [J])。 Fリターン[(1個の<< N) - 1] [N - 1]。 } メインINT() { int型のn; scanf関数( "%のD"、&N); (; iがN <++ iが0 = INT)のための (INT J = 0であり、j <N; ++ j)のため のscanf(」 printf( "%d個の\ n"(n)を解きます)。 }