問題Luogu P3959 [トレジャーへのソリューション

それほど遅いような圧力に?

それの何の問題紫色の質問の難易度が存在しないと言って、そのデータはまた、水であります


データサイズを見て、N≤12 N- 1 2、決定的状圧力。

次に列挙する開始点、配置されたDP D Pステート:

F [I] [J] = iのjへの最小コスト状態を起点として

前記J Jはバイナリ数(小数として表される)であり、私は私は少し。1 1 0 0は、それぞれ第1達したかどうかI Iは、点(1つの。1意味に達した、0 0手段が到達していません)

(以来M 大M、N- 、N-小さい、複数のエッジ、隣接行列(が存在するであろうE [U] [V] E [ U ] [ V ]))

状態遷移方程式を挙げることができます。

F [I] [J] =分{F [i]が[K] +ディス[I] [K] [U] * E [U] [V]} 

(J&(1 <<(U-1))! = 0、J&(1 <<(V-1))!= 0、I!= V、K = J ^(1 <<(V-1))、E [U] [V]!= 1E9)

(E [U] [V]!= 1E9 E [ U ] [ V ] = 1 E 。9言われているU U、VはVと縁取ら)

これは何を意味するのでしょうか?我々は状態(見つけることk個の現在の状態(以下K)jはj)は、わずか数点(当然の出発点にすることはできません)、そしてからのk kにJ の全てで、Jを拡大するk個のkの最も安価な種類をとり、 。

しかし、問題があり、数え方の側面を取りますか?

主題の説明は、それが乗じ辺の長さに出発点であり、uはuが(経過ポイントDIS [I] [J] [U] D I S [ I ] [ J ] [ U ])にします。

問題再び、DIS [i]は[J] [U] D I S [ I ] [ J ] [ U ]どのようにカウントしますか?

道の状態遷移をそらすたびに

コードは以下の通りであります:

#include <cstdioを> 

インラインINT読み出す(){ 
	int型、R = 0、F = 1。
	チャーC = GETCHAR()。
	一方、(C < '0' || C> '9'){IF(C == ' - ')は、f = -1; C = GETCHAR();} 
	一方(> = '0' && C <= '9 C ')R =(R << 1)+(R << 3)+ C-'0'、C = GETCHAR()。
	R * Fを返します。
} 

int型N、ANS = 1E9、M、F [15] [5005]、E [15] [15]、DIS [15] [5005] [15]。

インラインINT分(INT A、INT B){ 
	?<B戻り:Bと、
} 

int型のmain(){ 
	freopenは( "treasure.in"、 "R"、STDIN)。
	freopenは( "treasure.out"、 "W"、STDOUT)。
	N = read()は、M = read()は、
	以下のために(INT i = 1; iが<= N; I ++)
		のための(INT J = 1; J <= N; J ++)
			E [I] [J] = 1E9は、
	以下のために(INT I = 1; I <= M。
		私は++){ int型、U = read()は、V =)は(読み取り、
		IF(UV)E [U] [V] = E [V] [U] =分(E [U] [V])(リード)。
	}
	以下のために(INT i = 1; iが<= N; I ++)
		のための(INT J = 1、J <1 << Nであり; J ++)
			F [i]は[J] = 1E9。
	以下のために(INT i = 1; iは= N <; iは++){ 
		F [i]が[1 <<(I-1)] = 0; 
		DIS [I] [1 <<(I-1)] [I] = 1。
		{(; J <1 << N J ++ INT J =(1 <<(I-1))+ 1)についての
			場合(!(J&(1 <<(I-1))))続けます。
			int型のx = J、U = 1; 
			一方、(X){ 
				{IF(X&1)
					(int型V = 1; V <=はN; V ++)のために{ 
						!IF(I == V || E [U] [V] == 1E9 ||(J&(1 <<(V-1))))続けます。
						INT K = J ^(1 <<(V-1))。
						もし{([I] [K] + DIS [I] [K] [U] * E [U] [V] F [I] [J]> F)
							[i] [j]はFを= F [i]を[K] + DIS [I] [K] [U] * E [U] [V]。
							用(INT y = 1であり; y <= N; Y ++)DIS [I] [J] [Y] = DIS [I] [K] [Y]。
							DIS [I] [J] [V] = DIS [I] [K] [U] +1。
				X >> = 1。
			} 
		} 
		ANS =分(ANS、F [i]が[(1 << N)-1])。
	} 
	のprintf( "%dの"、ANS)。
	0を返します。
}

  

おすすめ

転載: www.cnblogs.com/wyzwyz/p/11542904.html