import java.io.*;
import java.util.*;
public class SW2814 {
static StringBuilder sb = new StringBuilder();
static int[][] graph;
static boolean[] visited;
static int N, M, answer;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(br.readLine());
for (int t = 1; t <= T; t++) {
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
graph = new int[N+1][N+1];
visited = new boolean[N+1];
answer = 0;
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
graph[x][y] = graph[y][x] = 1; //정점 연결
}
for (int i = 1; i <= N; i++) {
dfs(i, 1);
visited[i] = false;
}
sb.append("#").append(t).append(" ").append(answer).append("\n");
}
System.out.println(sb);
}
static void dfs(int idx, int cnt) {
visited[idx] = true;
for (int i = 1; i <= N; i++) {
if (graph[idx][i] == 1 && !visited[i]) {
dfs(i,cnt+1);
visited[i] = false;
}
}
answer = Math.max(answer, cnt);
}
}
풀이
우선 정점의 간선을 연결하는 작업이 먼저이기 때문에 graph 배열에 정점끼리 연결하고 1을 넣어 표시한다.
1번부터 N번 까지 반복해야 하므로 visited 배열은 N+1 형태로 만들어준다.
반복문을 1부터 N까지돌며 dfs탐색을 한다. 탐색이 끝나면 visited[i] = false
방문표시를 하고 정점끼리 차례대로 연결한다. cnt는 1부터 시작해야 정점의 개수를 나타낼 수 있다.
노드마다 최장 경로는 answer에 담아준다.