-
[KOITP] 보물섬자료구조 및 알고리즘/문제풀이 2017. 1. 16. 08:02
출 처 : http://koitp.org/problem/SDS_PRO_4_3/read/
시간 제한 메모리 제한 제출 횟수 정답 횟수 (비율) 정답자 수 1.0 초 512 MB 2632 473 (18%) 354 < Comment >
제대로 된 답이 안 나와서 한참 헤매었는데, 결국 보물섬을 T로 놓고 풀어야 했는데, N으로 놓고 풀어서 답이 어중간하게 맞은 것이었습니다. 문제를 잘 읽는 것도 중요한데, 아직 너무 부주의한 것 같습니다.
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Collections; import java.util.StringTokenizer; public class TreasureIsland { public static int N = 0; public static int M = 0; public static int T = 0; public static ArrayList<Node>[] arr = null; public static int Relaxing[] = null; public static int INF = Integer.MAX_VALUE; public static class Node { int to = 0; int coast = 0; public Node(int to, int coast) { this.to = to; this.coast = coast; } public int getTo() { return to; } public int getCoast() { return coast; } } public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); StringTokenizer st = new StringTokenizer(br.readLine()); N = Integer.parseInt(st.nextToken()); M = Integer.parseInt(st.nextToken()); T = Integer.parseInt(br.readLine()); arr = new ArrayList[N + 1]; for (int i = 1 ; i <= N ; i++) { arr[i] = new ArrayList<Node>(); } int from = 0; int to = 0; int coast = 0; for (int i = 1 ; i <= M ; i++) { st = new StringTokenizer(br.readLine()); from = Integer.parseInt(st.nextToken()); to = Integer.parseInt(st.nextToken()); coast = Integer.parseInt(st.nextToken()); arr[from].add(new Node(to, coast)); } Relaxing = new int[N + 1]; for (int i = 2 ; i <= N ; i++) { Relaxing[i] = INF; } Relaxing[1] = 0; Daijkstra(1); int whenGo = Relaxing[T]; Relaxing = new int[N + 1]; for (int i = 1 ; i < N ; i++) { Relaxing[i] = INF; } Relaxing[T] = 0; Daijkstra(T); int whenBack = Relaxing[1]; if (whenGo == INF || whenBack == INF) { bw.write("NO\n"); } else { bw.write("YES\n" + (whenGo + whenBack) + "\n"); } bw.flush(); bw.close(); } public static void Daijkstra(int node) { if(arr[node] == null) return; ArrayDeque<Integer> dq = new ArrayDeque<>(); for (Node n : arr[node]) { int newRel = Relaxing[node] + n.getCoast(); if(Relaxing[n.getTo()] > newRel) { Relaxing[n.getTo()] = newRel; dq.addLast(n.getTo()); } } while(!dq.isEmpty()) { Daijkstra(dq.pollFirst()); } } }