import java.io.*;
import java.util.*;
public class Main{
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String mn[] = br.readLine().split(" ");
int n = Integer.parseInt(mn[0]);
int m = Integer.parseInt(mn[1]);
boolean []visited = new boolean[n+1];
int []distance = new int[n+1];
boolean[][]arr = new boolean[n+1][n+1];
for(int i=0;i<m;i++){
String input[] = br.readLine().split(" ");
int x = Integer.parseInt(input[0]);
int y = Integer.parseInt(input[1]);
arr[x][y] = true;
arr[y][x] = true;
}
Queue<Integer> q = new LinkedList<>();
q.add(1);
while(!q.isEmpty()){
int k = q.poll();
visited[k] = true;
for(int i=1;i<=n;i++){
if(arr[k][i] && !visited[i]){
//만약 방문안한곳이고,내 인접한놈이면 재귀호춯한다
distance[i] = distance[k] + 1;
q.add(i);
visited[i] = true;
}
}
}
int max = distance[0];
int maxIdx = 0;
int eq = 0;
for(int i=1;i<n+1;i++){
if(max < distance[i]) {
max = distance[i];
maxIdx = i;
}
}
for(int i=1;i<n+1;i++){
if(max == distance[i]) {
eq++;
}
}
System.out.println(maxIdx + " " + max + " " + eq );
}
}
인접행렬로 풀었었다. 그런데 인접행렬로풀면 메모리 + 시간이 오래걸린다(nxn번을 다 확인해야하니)
인접행렬말고 이웃한것들만 리스트로 저장하면 훨씬 메모리 + 시간절약이된다
import java.io.*;
import java.util.*;
public class Main{
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String mn[] = br.readLine().split(" ");
int n = Integer.parseInt(mn[0]);
int m = Integer.parseInt(mn[1]);
boolean []visited = new boolean[n+1];
int []distance = new int[n+1];
ArrayList<Integer> list[] = new ArrayList[n+1];
for(int i=0;i<=n;i++){
list[i] = new ArrayList<>();
}
for(int i=0;i<m;i++){
String input[] = br.readLine().split(" ");
int x = Integer.parseInt(input[0]);
int y = Integer.parseInt(input[1]);
list[x].add(y);
list[y].add(x);
}
Queue<Integer> q = new LinkedList<>();
q.add(1);
while(!q.isEmpty()){
int k = q.poll();
visited[k] = true;
for (int x:list[k]) {
if(!visited[x]){
distance[x] = distance[k] + 1;
q.add(x);
visited[x] = true;
}
}
}
int max = distance[0];
int maxIdx = 0;
int eq = 0;
for(int i=1;i<n+1;i++){
if(max < distance[i]) {
max = distance[i];
maxIdx = i;
}
}
for(int i=1;i<n+1;i++){
if(max == distance[i]) {
eq++;
}
}
System.out.println(maxIdx + " " + max + " " + eq );
}
}
나는 block을 빼낸 point에서 ++만시켰다.