백준

[백준] 18352 특정 거리의 도시 찾기 [자바]

거북이같은곰 2022. 5. 26. 20:37

 

 


https://www.acmicpc.net/board/view/58477

 

글 읽기 - 테스트 케이스 추가 부탁드립니다.

댓글을 작성하려면 로그인해야 합니다.

www.acmicpc.net

https://steady-coding.tistory.com/82

 

[BOJ] 백준 1504번 : 특정한 최단 경로 (JAVA)

문제 방향성이 없는 그래프가 주어진다. 세준이는 1번 정점에서 N번 정점으로 최단 거리로 이동하려고 한다. 또한 세준이는 두 가지 조건을 만족하면서 이동하는 특정한 최단 경로를 구하고 싶

steady-coding.tistory.com

 

 


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
class Node implements Comparable<Node> {
	int to;
	int weight;
	public Node(int to, int weight) {
		this.to = to;
		this.weight = weight;
	}
	@Override
	public int compareTo(Node o) {
		// TODO Auto-generated method stub
		return weight - o.weight;
	}
	
}

public class Main {
	static ArrayList<ArrayList<Node>> graph = new ArrayList<>();
	static int N,M,K,X;
	static int[] distance;
	static boolean[] visit;
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		N = Integer.parseInt(st.nextToken());
		M = Integer.parseInt(st.nextToken());
		K = Integer.parseInt(st.nextToken());
		X = Integer.parseInt(st.nextToken());
		for(int i = 0; i <= N; i++) {
			graph.add(new ArrayList<>());
		}
		
		for(int i = 0; i < M; i++) {
			st = new StringTokenizer(br.readLine(), " ");
			int start = Integer.parseInt(st.nextToken());
			int end = Integer.parseInt(st.nextToken());
			graph.get(start).add(new Node(end, 1));
		}
		distance = new int[N+1];
		visit = new boolean[N+1];
		dijkstra(X);
		boolean result = false;
		for(int i = 1; i <= N; i++) {
			if(distance[i] == K) {
				sb.append(i).append('\n');
				result = true;
			}
		}
		
		if(result)
			System.out.println(sb);
		else
			System.out.println(-1);
	}
	static int dijkstra(int start) {
		PriorityQueue<Node> pq = new PriorityQueue<>();
		pq.add(new Node(start,0));
		while(!pq.isEmpty()) {
			Node tmp = pq.poll();
			int to = tmp.to;
			if(visit[to]) continue;
			
			visit[to] = true;
 			for(Node n : graph.get(to)) {
				if(distance[n.to] != 0 || visit[n.to]) continue;
				
				distance[n.to] = n.weight + distance[to];
				pq.add(new Node(n.to,distance[n.to]));
			}
		}
		return distance[start];
	}
}