04 May 2023

[Java] 백준 14218번: 그래프 탐색 2

14218

풀이 방법

Graph와 BFS를 사용해서 해결할 수 있는 문제이다.

풀이 코드

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class BOJ_14218_그래프_탐색_2 {
	static ArrayList<Integer>[] GRAPH;
	static int[][] result;
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		StringBuilder sb = new StringBuilder();
		
		int n = Integer.parseInt(st.nextToken());
		int m = Integer.parseInt(st.nextToken());
		GRAPH = new ArrayList[n+1];
		for(int i=1; i<n+1; i++) {
			GRAPH[i] = new ArrayList<>();
		}
		
		for(int i=0; i<m; i++) {
			st = new StringTokenizer(br.readLine());
			int to = Integer.parseInt(st.nextToken());
			int from = Integer.parseInt(st.nextToken());
		
			GRAPH[to].add(from);
			GRAPH[from].add(to);
		}

		int makeNewRoads = Integer.parseInt(br.readLine());
		result = new int[makeNewRoads][n+1];
		for(int i=0; i<result.length; i++) {
			Arrays.fill(result[i], 999999);
		}
		
		for(int i=0; i<makeNewRoads; i++) {
			st = new StringTokenizer(br.readLine());
			int to = Integer.parseInt(st.nextToken());
			int from = Integer.parseInt(st.nextToken());

			GRAPH[to].add(from);
			GRAPH[from].add(to);
			
			bfs(i, 1, new boolean[GRAPH.length]);
		}
		
		for(int i=0; i<result.length; i++) {
			for(int j=1; j<result[0].length; j++) {
				sb.append(result[i][j]+" ");
			}
			sb.append("\n");
		}
		
		System.out.println(sb);
	}
	
	
	private static void bfs(int testOrder, int startV, boolean[] v) {
		Queue<int[]> q = new LinkedList<>();
		q.add(new int[] {startV, 0});
		v[startV] = true;
		
		while(!q.isEmpty()) {
			int[] now = q.poll();
			
			if(result[testOrder][now[0]] == 999999) {
				result[testOrder][now[0]] = now[1];
			}
			
			for(int i=0; i<GRAPH[now[0]].size(); i++) {
				int element = GRAPH[now[0]].get(i);
				if(!v[element]) {
					v[element] = true;
					q.add(new int[] {element, now[1]+1});
				}
			}
		}
		
		for(int i=1; i<v.length; i++) {
			if(result[testOrder][i] == 999999) {
				result[testOrder][i] = -1;
			}
		}
		
	}
}
Thank You For Reading
SeungJun Jeon

점점 강해지고 있습니다.

comments powered by Disqus