1+ import java .io .*;
2+ import java .util .*;
3+
4+ public class Main {
5+ static int N , M , K ;
6+ static int [][] graph ;
7+ static boolean [][] visited ;
8+ static int [] dx = {0 , 0 , -1 , 1 };
9+ static int [] dy = {-1 , 1 , 0 , 0 };
10+ static int maxFoodSize = 0 ;
11+
12+ public static void main (String [] args ) throws IOException {
13+ BufferedReader br = new BufferedReader (new InputStreamReader (System .in ));
14+ StringTokenizer st = new StringTokenizer (br .readLine ());
15+
16+ N = Integer .parseInt (st .nextToken ());
17+ M = Integer .parseInt (st .nextToken ());
18+ K = Integer .parseInt (st .nextToken ());
19+
20+ graph = new int [N +1 ][M +1 ];
21+ visited = new boolean [N +1 ][M +1 ];
22+
23+ for (int i =0 ; i <K ; i ++){
24+ st = new StringTokenizer (br .readLine ());
25+ int x = Integer .parseInt (st .nextToken ());
26+ int y = Integer .parseInt (st .nextToken ());
27+
28+ graph [x ][y ] = 1 ;
29+ }
30+
31+ // for(int[] arr : graph){
32+ // for(int a : arr){
33+ // System.out.print(a + " ");
34+ // }
35+ // System.out.println();
36+ // }
37+
38+
39+ for (int i =1 ; i <=N ; i ++){
40+ for (int j =1 ; j <=M ; j ++){
41+ if (!visited [i ][j ] && graph [i ][j ] == 1 ){
42+ // int foodSize = dfs(i, j);
43+ // System.out.println("i: " + i + "j: " + j + "foodSize: " + foodSize);
44+ // maxFoodSize = Math.max(dfs(i, j), maxFoodSize);
45+ maxFoodSize = Math .max (bfs (i , j ), maxFoodSize );
46+
47+ }
48+ }
49+ }
50+
51+ System .out .println (maxFoodSize );
52+ }
53+
54+ static int dfs (int x , int y ){
55+ visited [x ][y ] = true ;
56+ int size = 1 ;
57+
58+ for (int i =0 ; i <=3 ; i ++){
59+ int newX = x +dx [i ];
60+ int newY = y +dy [i ];
61+
62+ if (rangeCheck (newX , newY ) && !visited [newX ][newY ] && graph [newX ][newY ] == 1 ){
63+ size +=dfs (newX , newY );
64+ }
65+ }
66+
67+ return size ;
68+ }
69+
70+ static int bfs (int x , int y ){
71+ int size = 0 ;
72+ Queue <Node > q = new LinkedList <>();
73+ q .offer (new Node (x , y ));
74+
75+ while (!q .isEmpty ()){
76+ Node node = q .poll ();
77+
78+ for (int i =0 ; i <=3 ; i ++){
79+ int newX = node .x +dx [i ];
80+ int newY = node .y +dy [i ];
81+
82+ if (rangeCheck (newX , newY ) && !visited [newX ][newY ] && graph [newX ][newY ] == 1 ){
83+ size ++;
84+ visited [newX ][newY ] = true ;
85+ q .offer (new Node (newX , newY ));
86+ }
87+ }
88+ }
89+
90+ return size ;
91+ }
92+
93+ static class Node {
94+ int x ;
95+ int y ;
96+
97+ Node (int x , int y ){
98+ this .x = x ;
99+ this .y = y ;
100+ }
101+ }
102+ static boolean rangeCheck (int x , int y ){
103+ return x >=1 && y >=1 && x <=N && y <=M ;
104+ }
105+ }
0 commit comments