console.log

[BOJ] 1238 파티 JAVA 본문

알고리즘/백준

[BOJ] 1238 파티 JAVA

foresight 2023. 10. 24. 15:16

https://www.acmicpc.net/problem/1238

 

1238번: 파티

첫째 줄에 N(1 ≤ N ≤ 1,000), M(1 ≤ M ≤ 10,000), X가 공백으로 구분되어 입력된다. 두 번째 줄부터 M+1번째 줄까지 i번째 도로의 시작점, 끝점, 그리고 이 도로를 지나는데 필요한 소요시간 Ti가 들어

www.acmicpc.net

 

메모리 : 24,396kb
실행시간 : 2,756ms

 

문제분석

다익스트라

단방향 그래프에서 인접행렬을 사용해
다익스트라로 최단경로를 구하자 !!!

 

걸린시간

40분 ⏱️

 

풀이방법

1. 인접 행렬 생성
2. 최단 거리 저장 배열 생성
3. 각 집마다 최단거리 계산 (다익스트라)
4. 계산된 거리를 이용해 가장 거리가 먼 집 구하기

 

포인트

다익스트라 알고리즘만 구현할 수 있다면 쉽게 풀 수 있는 문제 ! ! !
근데 최적화는 실패했다 .. 뭔가 겨우 통과한 느낌
다른 사람 풀이 궁금궁금

 

코드

package study.day1013;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class BOJ_1238_파티 {	// 메모리 : 24,396 kb		실행시간 : 2,756 ms
	static int N, M, X, ans = Integer.MIN_VALUE;
	static int[][] map;
	static int[][] len;
	static boolean[] visited;
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());

		N = Integer.parseInt(st.nextToken());
		M = Integer.parseInt(st.nextToken());
		X = Integer.parseInt(st.nextToken());

		map = new int[N + 1][N + 1];	// 인접행렬
		for (int i = 0; i < M; i++) {	// 인접행렬 입력받기
			st = new StringTokenizer(br.readLine());
			map[Integer.parseInt(st.nextToken())][Integer.parseInt(st.nextToken())] = Integer.parseInt(st.nextToken());
		}

		len = new int[N + 1][N + 1];	// 최단거리 저장 배열
		for (int i = 0; i <= N; i++) {
			Arrays.fill(len[i], Integer.MAX_VALUE);	// 최대값으로 초기화 
		}
		int minW, minV;
		for (int i = 1; i <= N; i++) {
			len[i][i] = 0;	// 시작정점
			visited = new boolean[N + 1];
			for (int n = 1; n <= N; n++) {
				minW = Integer.MAX_VALUE; 
				minV = -1;
				for (int j = 1; j <= N; j++) {
					if(!visited[j] && minW > len[i][j]) {
						minW = len[i][j];
						minV = j;
					}
				}
				if(minV == -1) continue;
				visited[minV] = true;

				for (int j = 1; j <= N; j++) {
					if(!visited[j] && map[minV][j] != 0 && len[i][j] > len[i][minV] + map[minV][j]) {
						len[i][j] = len[i][minV] + map[minV][j];
					}
				}
			}
		}
		for (int i = 1; i <= N; i++) {
			if(i == X) continue;
			ans = Math.max(ans, len[i][X] + len[X][i]);
		}
		System.out.println(ans);
	}
}

'알고리즘 > 백준' 카테고리의 다른 글

[BOJ] 4485 녹색 옷 입은 애가 젤다지? JAVA  (1) 2023.10.29
[BOJ] 13549 숨바꼭질 3 JAVA  (0) 2023.10.26
[BOJ] 1342 행운의 문자열 JAVA  (1) 2023.10.04
[BOJ] 17281 ⚾ JAVA  (0) 2023.10.03
[BOJ] 17070 파이프 옮기기 1 JAVA  (2) 2023.10.02