-
BOJ 1238 파티알고리즘/백준 2022. 1. 28. 20:00
1238번: 파티
첫째 줄에 N(1 ≤ N ≤ 1,000), M(1 ≤ M ≤ 10,000), X가 공백으로 구분되어 입력된다. 두 번째 줄부터 M+1번째 줄까지 i번째 도로의 시작점, 끝점, 그리고 이 도로를 지나는데 필요한 소요시간 Ti가 들어
www.acmicpc.net
처음에는 문제를 잘못 이해해서 단순히 x번 집에서 다른 집으로 가는 최소 거리를 구하면 된다는 생각에 그래프의 정보로 들어오는 시작점과 도착점을 반대로 해 Node를 생성하는 방식을 채택했다.
그리고 결과를 보고 나서 문제를 다시 한 번 봤는데 알고보니 갔다가 다시 돌아오는 것이어서 방법을 바꿨다.
그런데 생각을 해보니 기존에 했던 방식은 우리가 2번으로 도착했다가 다시 돌아갈 수 있는 경로의 최소 거리인 것 같았다.
그래서 맨 처음 Node는 들어오는 값을 그대로 넣어서 알고리즘을 풀었고, 최소 거리 배열을 초기화한 후 거꾸로 넣은 Node들을 새로 넣어 다시 한 번 알고리즘을 통해 최소 거리를 도출해냈다.
그리고 그 거리들을 합해 그 중 최장 거리를 도출해서 정답을 받았다.
여기서 사용한 알고리즘은 다익스트라로 한 점에서 다른 점까지 가는 최단 거리를 구할 수 있는 알고리즘이다.
static void Dijkstra(int start, ArrayList<ArrayList<Info>> edge) { int cost = 0; distance[start] = 0; PriorityQueue<Info> que = new PriorityQueue<>(); que.add(new Info(start,0)); while(!que.isEmpty()) { Info i = que.poll(); int now = i.y; int dist = i.dist; if ( distance[now] < dist) { continue; } for ( int j = 0; j < edge.get(now).size(); j++) { cost = dist + edge.get(now).get(j).dist; if ( cost < distance[edge.get(now).get(j).y]) { distance[edge.get(now).get(j).y] = cost; que.add(new Info(edge.get(now).get(j).y, cost)); } } } }
이게 기본 다익스트라 알고리즘을 자바로 구현한 것이다. 원래는 edge가 들어가지 않지만, 거꾸로 만든 edge를 새로운 ArrayList에 넣어줬으므로 인자로 들어갈 수 있도록 표현했다.
실제 알고리즘은 알고 있는 다익스트라와 다를 것이 없다.
Dijkstra(x,edge); for ( int i = 1; i <= n; i++) { answer[i]+=distance[i]; } Arrays.fill(distance, INF); Dijkstra(x,edge2); for ( int i = 1; i <= n; i++) { answer[i]+=distance[i]; }
다익스트라를 활용해서 이런 방식으로 최장 거리를 계산하였다.
먼저 다익스트라를 정상으로 돌려서 2번에서 다른 집으로 갈 수 있는 최단 거리를 구한다.
그 뒤 시작점과 도착점을 뒤집은 edge2에서 다른 집에서 2번으로 갈 수 있는 최단 거리를 구하게 된다.
그 뒤 두 거리를 더해서 최장 거리를 구하면 끝이다.
우연한 아이디어를 통해서 문제를 풀었던 것이라서 가끔은 이런 실수들이 답을 도출해내는데 도움이 될 수 있다는 것을
깨닫게 된 순간이었다.
'알고리즘 > 백준' 카테고리의 다른 글
BOJ 21921 블로그 (0) 2022.02.11 BOJ 9177 단어 섞기 (0) 2022.01.26 BOJ 1613 역사 (0) 2022.01.21 BOJ 11404 플로이드 (0) 2022.01.20 BOJ 11051 이항 계수 2 (0) 2021.12.27