문제 보고서에 HRBUST1662 볼록 다각형 솔루션

주제 포털

[제목] 효과

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 }
코드는 여기 찌를

추천

출처www.cnblogs.com/THWZF/p/11423174.html