[BOJ] 15591. MooTube (Silver)

  • 메모리 : 310,292 KB
  • 시간 : 1,848 ms
  • 코드길이 : 1,899 B
  • 소요시간 : 2H
  • 처음에 플로이드 워셜로 모든 정점에 대한 최소거리를 구한 후 진행했는데 시간초과가 떳다… 사람들의 풀이법도 찾아봤는데 많이 나오지 않아서 C++로 풀이한 사람의 코드를 보고 풀었는데 사실 완벽히 이해가 되지는 않는다…! 다시 잘 차근히 이해해보고 혼자 풀어봐야할 것 같다!
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_B_15591_MooTubeSilver {

	static int N, Q;

	public static void main(String[] args) throws IOException {
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(in.readLine(), " ");
		StringBuilder answer = new StringBuilder();
		N = Integer.parseInt(st.nextToken());
		Q = Integer.parseInt(st.nextToken());

		ArrayList<Info>[] mootube = new ArrayList[N + 1];
		for (int i = 1; i < N + 1; i++) {
			mootube[i] = new ArrayList<>();
		}

		for (int i = 0; i < N - 1; i++) {
			st = new StringTokenizer(in.readLine(), " ");
			int p = Integer.parseInt(st.nextToken());
			int q = Integer.parseInt(st.nextToken());
			int r = Integer.parseInt(st.nextToken());
			mootube[p].add(new Info(q, r));
			mootube[q].add(new Info(p, r));
		}

		int ans;
		boolean[] visited;
		for (int i = 0; i < Q; i++) {
			st = new StringTokenizer(in.readLine(), " ");
			int k = Integer.parseInt(st.nextToken());
			int v = Integer.parseInt(st.nextToken());

			visited = new boolean[N + 1];
			ans = 0;
			visited[v] = true;
			Queue<Integer> queue = new LinkedList<Integer>();
			queue.offer(v);
			while (!queue.isEmpty()) {
				int cur = queue.poll();

				for (int j = 0; j < mootube[cur].size(); j++) {
					int next = mootube[cur].get(j).idx;

					if (visited[next]) continue;
					
					int nextVal = mootube[cur].get(j).val;

					if (nextVal >= k) {
						visited[next] = true;
						ans++;
						queue.offer(next);
					}
				}
			}

			answer.append(ans).append('\n');
		}

		System.out.println(answer);
	}

	private static class Info {
		int idx;
		int val;

		public Info(int idx, int val) {
			this.idx = idx;
			this.val = val;
		}
	}

}

Leave a comment