백준 18352 특정 거리의 도시 찾기
업데이트:
백준 특정거리의 도시 찾기
-
도시 갯수만큼 클래스 리스트를 만들어 큐를 사용해 구현함
-
소스 코드
public class Main {
static class City{
int next;
int cost;
City(int next, int cost) {
this.next = next;
this.cost = cost;
}
}
static int n,m,k,x;
static ArrayList<Integer> result = new ArrayList<Integer>();
static boolean[] visit;
static ArrayList<ArrayList<City>> citys;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//도시의 갯수
n = sc.nextInt();
//도로 갯수
m = sc.nextInt();
//거리 정보
k = sc.nextInt();
//출발 도시
x = sc.nextInt();
// 첫방문 체크
visit = new boolean[n+1];
citys = new ArrayList<ArrayList<City>>();
// 도시만큼 arry 생성
for(int i = 0; i <= n; i++) {
citys.add(new ArrayList<City>());
}
// 도로에 해당하는 city 입력
for(int i = 0; i < m; i++) {
int a = sc.nextInt();
int b = sc.nextInt();
citys.get(a).add(new City(b, 1));
}
findCity();
if(result.size() <= 0) {
System.out.println(-1);
} else {
Collections.sort(result);
for(int num : result) {
System.out.println(num);
}
}
}
private static void findCity() {
// 큐를 이용해 연결된 도로를 확인 후 입력 최단거리를 찾아냄
Queue<City> q = new LinkedList<City>();
// 자신의 위치는 0
q.offer(new City(x,0));
visit[x] = true;
while(!q.isEmpty()) {
City now = q.poll();
int nowCity = now.next;
int nowCost = now.cost;
ArrayList<City> nextCitys = citys.get(nowCity);
for(int i = 0;i < nextCitys.size(); i++) {
City nextCity = nextCitys.get(i);
//한번 방문한 경우 제외
if(visit[nextCity.next]) {
continue;
}
// 방문처리
visit[nextCity.next] = true;
//거리확인
if(nextCity.cost + nowCost < k) {
// 최단거리보다 작을경우 cost 갱신 후 다음 큐에 입력
nextCity.cost = nextCity.cost + nowCost;
q.offer(nextCity);
continue;
}
if(nextCity.cost + nowCost == k) {
result.add(nextCity.next);
}
}
}
}
}
댓글남기기