CodingTEST
[백준 11404] 플로이드(JAVA)
경걍
2024. 2. 11. 03:03
반응형
백준 11404번 문제 - 플로이드
11404번: 플로이드
첫째 줄에 도시의 개수 n이 주어지고 둘째 줄에는 버스의 개수 m이 주어진다. 그리고 셋째 줄부터 m+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그 버스의 출발 도시의 번호가
www.acmicpc.net
문제 분석
- n(2 ≤ n ≤ 100)개의 도시가 있다.
- 한 도시에서 출발하여 다른 도시에 도착하는 m(1 ≤ m ≤ 100,000)개의 버스가 있다.
- 각 버스는 한 번 사용할 때 필요한 비용이 있다.
- 모든 도시의 쌍 (A, B)에 대해서 도시 A에서 B로 가는데 필요한 비용의 최솟값을 구하는 프로그램을 작성
해결 포인트
- 플로이드–워셜 알고리즘 이용 (사실 BFS로 풀었지만 설명 읽어보니 이게 플로이드–워셜 같음)
- 방문처리를 위한 visited 배열 사용
- Edge 클래스 구현
- 끝 점 end
- 가중치 w
- 우선순위 큐 사용
- Queue<Edge> queue = new PriorityQueue<>();
- 결과를 기록할 배열 result[N+1][N+1] 구현
- 큐가 빌 때까지 반복 !
- 큐에서 꺼내서 Edge가 갈 수 있는 끝 점이 방문처리 되어 있으면 패스
- 아니면 끝 점에서 시작하는 Edge 확인
- result[start][e.end] = Math.min(value.w + e.w, result[start][e.end]);
코드
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));
int N = Integer.parseInt(br.readLine());
int M = Integer.parseInt(br.readLine());
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++) {
StringTokenizer 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);
}
br.close();
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
bw.write(result[i][j] + " ");
}
bw.newLine();
}
bw.flush();
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;
}
}
}
반응형