すべてのは、再び全体像のBFSを実行した後、我々は裁判官を配置する必要がありますので、明らかに非現実的です
そして、理由は3点のみ、無黒と白
あなたは互いに素セットの最適化を使用することができますので、
それは4つのグループの周囲の状況と判断された作品を追加
発生する状況と答え関係注間の差別
1 / * 2 書かによりStelaYuri 3 * / 4の#include <stdio.hに> 5の#include <memory.h> 6 INT N、M、DX [ 4 ] = { 1、0、 - 1、0 }、DY [ 4 ] = { 0、1、0、 - 1 }、GP [ 250010 ]。 7 チャー CM [ 505 ] [ 505 ]。 8 INT findp(INT P){ 9 リターン?P == GP [P] P:(GP [P] =findp(GP [P])); 10 } 11 int型プライム(int型のx、int型のY){ 12 リターン X> = 0 && Y> = 0 && X <N && Y < N。 13 } 14 INT メイン(){ 15 INT I、J、X、Y、XX、YY、ANS = 0 、G、D1、D2。 16 チャーC。 17 のmemset(CM、' '、はsizeof CM); 18 のためには、式(I = 0、I < 250000 ; I ++ ) 19 GP [I] = 私; 20 のscanf(" %D%D "、&N、&M)。 21 のために(私は= 0 ; I <M、I ++ ){ 22 のscanf(" %* C%C%D%D "、&C、およびX&Y)。 23の ANS ++ ; 24 のための(G = J = 0 ; J < 4 ; J ++ ){ 25 XX = X- 1 + DX [J]。 26 YY = Y- 1 + DY [J]。 27 であれば(プライム(XX、YY)&&センチ[XX] [YY] == {C) 28 findp = D1(GP [(X- 1)* N +(Y- 1 )]); 29 D2 = findp(GP [XX * N + YY]); 30 IF(!G){ // 周囲4箇所さらに場合直接のセットを持つものを組み合わせると回答のセット低減することができる、検出されない 31は G =を1。; 32 IF(D1 =!D2){ 33が IF(D1 < D2) 34である GP [D2 = D1; 35 他 36 GP [D1 ] = D2; 37 } 38で ans-- ; 39 } 40 他 { // 同じ基が発見された場合に位置を囲む4つの、二つを合わせ、回答グループのための必要性が減少した点の異なるセット場合にのみ 41である IF(D1!= D2){ 42が IF(D1 < D2) 43である GP [D2] = ; D1 44は 他の 45 GP [D1] = ; D2 46は ans-- ; 47 } 48 } 49 } 50 } 51である [X- CM&LT 1 ] [Y- 1。 ] = C; 52であります printf(" %dの\ n " 、ANS)。 53 } 54 55 戻り 0 ; 56 }