16947번: 서울 지하철 2호선
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
static ArrayList<Integer>[] edge;
static boolean[] visited;
static boolean[] cycle;
static int[] distance;
static int n;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(br.readLine());
edge = new ArrayList[n+1];
for(int i = 1; i<n+1; i++){
edge[i] = new ArrayList<>();
}
cycle = new boolean[n+1];
visited = new boolean[n+1];
for(int i = 0; i<n; i++){
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
edge[a].add(b);
edge[b].add(a);
}
for(int i = 1; i<n+1; i++){
if(checkCycle(i,-1, i)) break;
else visited = new boolean[n+1];
}
distance = new int[n+1];
bfs();
StringBuilder sb = new StringBuilder();
for(int i = 1; i<n+1; i++){
sb.append(distance[i] + " ");
}
System.out.println(sb);
}
public static boolean checkCycle(int now, int prev, int start){
visited[now] = true;
for(int i = 0; i<edge[now].size(); i++){
int next = edge[now].get(i);
if(!visited[next]){
if(checkCycle(next, now, start)){
cycle[next] = true;
return true;
}
}
else if(next != prev && next == start){
cycle[next] = true;
return true;
}
}
return false;
}
public static void bfs(){
Queue<Integer> queue = new LinkedList<>();
visited = new boolean[n+1];
for(int i = 1; i<n+1; i++){
if(cycle[i]){
visited[i] = true;
queue.add(i);
}
}
while(!queue.isEmpty()){
int a = queue.poll();
for(int i = 0; i<edge[a].size(); i++){
int b = edge[a].get(i);
if(!visited[b]){
queue.add(b);
visited[b] = true;
distance[b] = distance[a] + 1;
}
}
}
}
}