SSONG Cloud

[백준] 1238 파티 본문

Algorithm/백준

[백준] 1238 파티

SSONGMI 2021. 4. 26. 22:48
반응형

문제 출처: www.acmicpc.net/problem/1238

 

1238번: 파티

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

www.acmicpc.net

: 각각의 학생이 파티 장소까지 왕복할 때 가장 많은 시간이 소요된 학생의 시간을 구해야 한다.

: 다익스트라 알고리즘을 이용해 각각의 학생별로 왕복 시간을 구하고 최대값을 갱신하는 방식으로 진행할 수 있다.

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

public class Main {
	static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	static StringBuilder sb = new StringBuilder();
	static StringTokenizer st;
	static int N, M, X;
	static int[][] adj;
	public static void main(String[] args) throws IOException {
		st = new StringTokenizer(br.readLine());
		N = Integer.parseInt(st.nextToken());
		M = Integer.parseInt(st.nextToken());
		X = Integer.parseInt(st.nextToken());
		
		adj = new int[N+1][N+1];
		
		for(int i = 0; i < M; i++) {
			st = new StringTokenizer(br.readLine());
			int from = Integer.parseInt(st.nextToken());
			int to = Integer.parseInt(st.nextToken());
			int weight = Integer.parseInt(st.nextToken());
			adj[from][to] = weight;
		}
		
		int max = Integer.MIN_VALUE;
		for(int i = 1; i < N+1; i++) {
			int temp = calc(i, X) + calc(X, i);
			max = temp > max ? temp : max;
		}
		System.out.println(max);
	}
	private static int calc(int start, int end) {
		
		int[] minEdge = new int[N+1];
		Arrays.fill(minEdge, Integer.MAX_VALUE);
		minEdge[start] = 0;
		boolean[] v = new boolean[N+1];
		
		for(int i = 1; i < N+1; i++) {
			int min = Integer.MAX_VALUE;
			int minIdx = 0;
			
			for(int j = 1; j < N+1; j++) {
				if(!v[j] && min > minEdge[j] ) {
					minIdx = j;
					min = minEdge[j];
				}
			}
			v[minIdx] = true;
			if(minIdx == end) break;
		
			for(int j = 1; j < N+1; j++) {
				if(!v[j] && adj[minIdx][j] != 0 && minEdge[j] > minEdge[minIdx] +adj[minIdx][j]) {
					minEdge[j] = minEdge[minIdx] + adj[minIdx][j];
				}
			}
		}
		return minEdge[end];
	}
}
반응형

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

[백준] 1967 트리의 지름  (0) 2021.04.27
[백준] 1167 트리의 지름  (0) 2021.04.27
[백준] 2252 줄 세우기  (0) 2021.04.23
[백준] 2623 음악프로그램  (0) 2021.04.23
[백준] 16985 Maaaaaaaaaze  (0) 2021.04.21
Comments