[제목] 효과
US $의 N * m 개의 $ 행렬, 임의의 두 지점 사이의 경로가 두 차례 적어도 경우 격자의 복수의 검은 페인트, 또는 검은 색 계통이 모두 연결되어 있지가 있고, 그 다음 검정 격자 패턴으로 구성되지 볼록 다각형 그래픽 여부를 테스트 판정하는 볼록 다각형을 설명한다.
[분석] 아이디어
...... 사실,이 질문에 내가 어떻게 말할 시작했다
두 격자 사이의 경로가 모든면 훨씬 더 나은 후 우측 (1)에 연결되어이 두 격자의 중간에 다음, 흑자 전환 할 필요가없는 경우 어떤이있는 경우,보기의 모든 지점에서 최단 경로를 실행 두 지점 사이의 최단 경로는 다음 볼록없고, 2보다 크다.
[] 코드 구현
1 #INCLUDE <cstdio> 2 #INCLUDE <iostream> 3 #INCLUDE <CString을> 4 #INCLUDE <알고리즘> 5 #INCLUDE <cmath> 6 #INCLUDE <큐> 7 #DEFINE의 g () getchar가 () 8 #DEFINE의 RG 레지스터 9 #DEFINE의 이동 (I는은 b)에 대한 (RG의 INT 난 =; 나는 <= B를 단계; 내가 ++) 10 #DEFINE 백 (I, a가, b) (RG의 인터넷 용 난 =; I> = B; 난 -) 11 #DEFINE의 DB 이중 12 #DEFINE이 줄게 긴 길이 13 #DEFINE IL 인라인 14 #DEFINE PF printf의 15 #DEFINESF는 scanf 16 #DEFINE MEM (a, b)가 memset (A, B를 sizeof (a)) (17) 를 사용 스페이스 성병; 18 INT의 FR () { 19 INT w = 0 , Q = 1 ; 20 숯 CH = g (); 21 일 동안 (CH2 < ' 0 ' || CH> ' 9 ' ) { 22 일 경우 (CH2 == ' - ' ) Q = - 1 ; 23 CH = g (); 24 } 25 동안 (CH2> =' 0 ' && CH <=에서 ' 9 ' ) (w = w << 1 ) + (w << 3 ) + CH- ' 0 ' , CH = g (); 26 창 * w의 Q; 27 } 28 CONST의 INT N가 = 52 ; 29 CONST의 INT에서 M = 2502 ; 30 CONST의 INT의 INF 1E9 + = 7 ; 31 INT의 N, M, A [N] [N], DIS [M], 헤드 [M], ED, NUM; 32 부울 구경 [M]; 33 문자 S [N] [N]; (34) 구조체 에지 { 35 INT , 옆, w; 36 } E [M << 1 ]; 37 IL 공극 추가 (RG INT U, RG INT V) { 38 E [++ ED] 다음 내용 = 헤드 [U]; 39 E [ED] .TO = V, E [ED] .W = 1 ; 40 헤드 [U] = ED; 41 창 ; 42 } 43 IL 공극 준비 () { // 连边 44의 NUM = 0 ; ED = 0 ; MEM (헤드, 0 ); 45 이동 (I,. (1) , N-) 이동 (J, 1. , m) (46)는 IF (S [I] [J] == ' B ' = ++ NUM) A [I] [J]; // 각 흑색 계통 번호 (47) 로 이동 (I, 1. , N-) 이동 (J, 1. , m) { 48 IF (S [I] [J]! = ' B ' ) 계속해서 , 49 이동 (K, I는 + . 1 , N-) // 동일한 행 50 IF (S [K] [J] == ' B ' )에 추가 (a [I] [J], A [K] [J]); (51)는 의 다른 BREAK ; // 간헐적 종료하면 (52) 백 (K, I- 1 , 1 ) (53) 의 경우 (S [K] [J] == ' B ' )에 추가 (a [I] [J]를, A [K] [J]); (54) 다른 휴식 ; 55 이동 (K, J + 1 , m) // 同一行 56 의 경우 (S [I] [K] == ' B ' )에 추가 (a [I] [J]를, A [i]는 [K]); 57 다른 휴식 ; (58) 위로 (K, J = 1 , 1 ) (59) 의 경우 (S [I] [K] == ' B ' )에 추가 (a [I] [J], A [i]는 [K]); (60) 다른 BREAK ; 61이다 } (62)는 리턴 ; 63이다 } 64 IL BOOL SPFA (RG INT X) { // 최단 65 이동 (I, 1. , NUM) DIS [I] = INF; 66 MEM (구경, 0 ), DIS [X = 0 ; 67 큐 < INT > Q; 68 q.push (X) (69) 그동안 (! q.empty ()) { // 사용이 갱신되지 최단 시점에서 업데이트 된 비확산 70 RG INT U = q.front (); 71은 () q.pop = [U] 참조 0 ; 72 대 (RG의 INT의 I = 헤드 [U] I, I = E [i]는 다음 내용) { 73 의 RG INT의 V = E [I] .TO, w = E [I] .W; 74 의 경우 (DIS [V]> DIS [U] + w) { 75 DIS [V] = DIS [U] + w; 76 의 경우 매장 [V] = (참조 [V]!) 1 , q.push (V); 77 } 78 } 79 } 80 이동 (I, 1 , NUM) (81) 의 경우 (DIS [I]> 2 ) 복귀 0 ; 82 창 1 ; 83 } 84 INT 의 main () { 85 동안 (SF ( " %의 D % d에 " , N, m)! = EOF) { 86 이동 (I, 1 , N) (SF) ( " %의 S " , S [I] + 1 ); 87 ) (준비; 88 부울 단부 = 0 ; (89) 이동 (I, 1 , NUM) (90) 의 경우 {단부 = (SPFA (I)!) 1 ; 침입 } (91) 의 경우 (최종) PF ( " 아니오 \ 해당 없음" ) 92 다른 PF ( " YES \ n을 " ); 93 } 94 반환 0 , 95 }