Closed baexxbin closed 2 weeks ago
2 <= 마을의 개수 (노드 개수) <= 1,000
2 <= 도로의 정보 (간선의 개수) <= 200,000
그래프 상에서 최소 거리 구하기: 다익스트라 → O(200,000(간선) × log 1,000 (노드))
ArrayList<Node> adj[]
: 인접리스트 정보 입력받기dijkstra()
: 우선순위큐를 이용한 다익스트라 알고리즘을 통해 출발지점으로부터 떨어진 최소 거리 구하기long[] dis
: 출발 지점으로부터 떨어진 최소 거리Arrays.sort(dis)
후 한 번에 갈 수 있는 최대 거리인 X
와 비교하며 몇 번 왔다 갔다 해야되는지 확인하기Dijkstra
-> PriorityQueue
최소 거리 구하기 for (int i = 0; i < N; i++) { // 거리 확인
if (i != Y) { // 성현이의 집은 제외
if (distance[i] * 2 > X) { // 왕복 거리 초과
System.out.println(-1); // 방문x
return;
}
if (totalDistance + distance[i] * 2 > X) { // 하루 이동 거리 초과한 경우
days++; // 하루 추가
totalDistance = 0; // 새로운 날로 초기화
}
totalDistance += distance[i] * 2; // 방문한 거리 추가
}
}
개인적으로 최소 일수 계산하는게 어려웠습니다
2 ≤ N ≤ 1,000
양방향 도로 1 ≤ M ≤ 100,000
우선순위 큐를 이용할 경우 O(logN)
+ 다익스트라 알고리즘 O((N+M))
= O((N+M)logN)
코드 | 설명 |
---|---|
List<List<Pos>> graph |
양방향 그래프 (하나의 Pos 당 여러개의 노드 존재) |
int[] table |
각 노드 별 최단거리를 저장하는 테이블 |
PriorityQueue<Pos> road |
다음 노드 탐색 순서를 저장 (최단거리 값을 기준으로 오름차순 정렬) |
int INF = Integer.MAX_VALUE |
초기값 설정을 위한 변수 |
거리가 가까운 집부터 방문
PriorityQueue
를 사용 해 거리가 가까운 노드 기준으로 오름차순 정렬해서 거리가 가까운 집부터 탐색집에서 자야 하므로 왕복할 수 없는 거리는 다음날 가기로
하루에 X보다 먼 거리를 걷지 않고
O((V+E)logV)
, < N*M(10^8)다익스트라
dist배열
)계속 틀리는 이유가 long형을 안써서인줄 알았는데 떡돌리는 날짜에서 잘못됐었네요...
처음 아이디어(떡 돌리는 최소 일 구하기)
int left = 0;
int right = N - 1;
int cnt = 0;
while (left <= right) {
int tmp = dist[right];
right--;
while (left <= right && tmp + dist[left] <= X) {
tmp += dist[left];
left++;
}
cnt++;
}
=> 다익스트라 시간복잡도 : O(E logV)
귀찮은 성현이는 하루에 X보다 먼 거리를 걷지 않고 거리가 가까운 집부터 방문한다.
는 조건 때문에 다익스트라
충분히 가능!다익스트라
dist[n-1]
이 하루에 왕복 불가능하다면 -1 출력