"24 네트워크 흐름 문제"문제의 섬의 구조

때는 리셋 상태 $ (x는, Y는, H) $는 점 $ (x, y)를 인 $ 현재 키 세트 $ H는 $ 최단를 얻기 $의 대금을 $으로 짧다.

 

사용법 #include <iostream> 
#INCLUDE <알고리즘> 
#INCLUDE <cstdio> 
#INCLUDE <설정> 
#INCLUDE <지도> 
#INCLUDE <큐> 
#DEFINE REP (I, A, N)에 대해 INT (나는 A =; I <= N; ++ I) 
I> = A; #DEFINE PER (I, A, N)을위한은 (i = N에서 INT - i)는 
네임 스페이스를 사용하여 표준; 
튜플 타입 정의 <INT, INT, INT, INT> T4; 
튜플 타입 정의 <INT, INT, INT> T3; 

CONST의 INT의 DX [] = {0,0, -1,1}; 
CONST의 INT의 DY [] = {- 1,1,0,0}; 
INT의 N, M, P, K, S; 
지도 <T4, INT> F; 
집합 <T3> 힘; 
지도 <T3, INT> DIS; 
int로 A [20] [20]; 
큐 <T3> Q; 

INT의 main () { 
	는 scanf ( "% D % D % D % D", 및 N, M, P, K); 
	REP (I, 1, k)는 { 
		INT의 X1,
		scanf와 ( "% D % D % D % D % D", X1, Y1, X2, Y2, g);
		F [T4 (X2, Y2, X1, Y1) = F [T4 (X1, Y1, X2, Y2) = g (1) << 1 g : 1 << (P); 
	} 
	는 scanf ( "%의 D", S); 
	REP (I, 1, S) { 
		INT X, Y, Q; 
		scanf와 ( "% D % D % D ', X, Y, Q); 
		A [X] [Y] | = 1 << Q-1; 
	} 
	q.push (T3 (1,1, A [1] [1])); 
	DIS [q.front () = 0; 
	vis.insert (q.front ()); 
	INT ANS = 1E9; 
	반면 (q.size ()) { 
		T3 q.front U = (); q.pop (); 
		INT의 X, Y, H; 
		타이 (X, Y, H) = U; 
		경우 (X == N && == Y의 m) ANS = 분 (ANS, DIS [U]); 
		REP (I, 0,3) { 
			INT XX = X + DX [I]는 YY = Y +의 DY의 [I]; 
			경우 (1 <= XX && XX <= N && 1 <= YY YY && <= m) { 
				T3의 V (XX, YY, H | A [XX] [YY]); 
				(vis.count는 (V)) 계속 경우;
					DIS는 [V] = DIS [U] +1; 
					vis.insert (V); 
					q.push (V); 
				} 
			} 
		} 
	} 
	의 printf ( "% D \ 없음", ANS == 1E9 -1 : ANS); 
}

 

추천

출처www.cnblogs.com/uid001/p/10991677.html