반응형
백준 1238번 문제 - 파티
1238번: 파티
첫째 줄에 N(1 ≤ N ≤ 1,000), M(1 ≤ M ≤ 10,000), X가 공백으로 구분되어 입력된다. 두 번째 줄부터 M+1번째 줄까지 i번째 도로의 시작점, 끝점, 그리고 이 도로를 지나는데 필요한 소요시간 Ti가 들어
www.acmicpc.net
문제 분석
- N개의 숫자로 구분된 각각의 마을에 한 명의 학생이 살고 있다.
- N명의 학생이 X (1 ≤ X ≤ N)번 마을에 모여서 파티를 벌이기로 했다.
- 이 마을 사이에는 총 M개의 단방향 도로들이 있고 i번째 길을 지나는데 Ti(1 ≤ Ti ≤ 100)의 시간을 소비한다.
- 이 때, 학생들은 워낙 게을러서 최단 시간에 오고 가기를 원한다.
- N명의 학생들 중 오고 가는데 가장 많은 시간을 소비하는 학생은 누구일지 구하여라.
해결 포인트
- 다익스트라(Dijkstra) 알고리즘 사용
- Edge 클래스 구현
- 도착지 end
- 가중치 w
- 결과를 저장할 results 배열 구현
- Edge Comparable는 가중치가 작은 순으로 정렬되도록 구현
- 우선순위 큐 사용
- Queue<Edge> q = new PriorityQueue<>();
- 방문 확인 visited 배열 구현
- 처음 시작 위치 큐에 삽입
- q.add(new Edge(start, 0));
- 큐가 빌 때까지 반복
- 큐에서 하나 꺼내기
- 방문한 위치면 패스(continue)
- 방문 안한 위치면 방문 등록 후, 갈 수 있는 공간 큐에 추가
코드
import java.io.*;
import java.util.*;
public class Main {
public static int [][] result;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
int X = Integer.parseInt(st.nextToken());
ArrayList<Edge> [] edges = new ArrayList[N+1];
for (int i = 1; i <= N; i++) {
edges[i] = new ArrayList<>();
}
result = new int[N+1][N+1];
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
int w = Integer.parseInt(st.nextToken());
edges[a].add(new Edge(b,w));
result[a][b] = w;
}
for (int i = 1; i <= N; i++) {
BFS(i, edges);
}
int max = 0;
for (int i = 1; i <= N; i++) {
max = Math.max(result[i][X] + result[X][i], max);
}
bw.write(max+"\n");
bw.flush();
br.close();
bw.close();
}
public static void BFS(int start, ArrayList<Edge> [] edges) {
Queue<Edge> queue = new PriorityQueue<>();
boolean[] visited = new boolean[edges.length];
queue.add(new Edge(start, 0));
while (!queue.isEmpty()) {
Edge value = queue.poll();
if(!visited[value.end]) {
visited[value.end] = true;
for (Edge e : edges[value.end]) {
if (!visited[e.end]) {
if(result[start][e.end] != 0)
result[start][e.end] = Math.min(value.w + e.w, result[start][e.end]);
if(result[start][e.end] == 0)
result[start][e.end] = value.w + e.w;
queue.add(new Edge(e.end, value.w + e.w));
}
}
}
}
}
public static class Edge implements Comparable<Edge> {
int end;
int w;
public Edge(int end, int w) {
this.end = end;
this.w = w;
}
@Override
public int compareTo(Edge o) {
if(w == o.w)
return end - o.end;
return w - o.w;
}
}
}
반응형
'CodingTEST' 카테고리의 다른 글
[백준 2206] 벽 부수고 이동하기(JAVA) (2) | 2024.02.22 |
---|---|
[프로그래머스] 다리를 지나는 트럭 (JAVA) (0) | 2024.02.18 |
[백준 11404] 플로이드(JAVA) (1) | 2024.02.11 |
[백준 9663] N-Queen(JAVA) (1) | 2024.02.11 |
[백준 1967] 트리의 지름(JAVA) (1) | 2024.02.11 |