Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 도둑질
- 컴퓨터구조
- 토마토
- 조합
- 코테
- 메뉴 리뉴얼
- 베스트 앨범
- java
- 데이터
- 표 편집
- 다단계 칫솔 판매
- Comparable
- 오블완
- 기능 개발
- swea
- 고정소수점
- 부동소수점
- Call-by-Value
- 컴퓨터 구조
- sw expert academy
- Comparator
- 운영 체제
- 프로그래머스
- 티스토리챌린지
- 괄호 회전하기
- 자바
- 백준
- 순열
- 구현
- 요세푸스
Archives
- Today
- Total
감자는 아직 꿈을 꾼다.
[백준-java] 골드 4 타임머신 본문
알고리즘 : 벨만 포드 알고리즘
다익스트라 알고리즘과 달리 음의 가중치인 경우에 최단경로 구하기가 가능하다.
하지만 다익스트라 알고리즘에 비해서 모든 간선을 다 확인하므로 O(V * E)로 시간복잡도가 느리다.
또한 음의 순환의 확인이 가능하다.
음의 순환이 존재하면 최단경로는 구할 수 없다.
문제
https://www.acmicpc.net/problem/11657
내 풀이
기본적인 벨만포드 알고리즘으로 풀었다.
풀다보면 38프로에서 출력초과가 뜨는 경우가 있는데
이 조건에서 n= 500,m = 6000인 경우 모든 간선이 -10000 일 경우 최단경로 값이 -30억이 나올 수 있기에
Int오버플로우가 발생하는 경우 일 것이다. 이는 dist 배열을 Long 타입으로 선언하여 해결 할 수있다.
package com.example;
import java.util.*;
import java.io.*;
class Node {
int dest, cost;
public Node(int dest, int cost) {
this.dest = dest;
this.cost = cost;
}
}
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
// 초기화
ArrayList<Node>[] adjList = new ArrayList[n + 1];
for (int i = 0; i <= n; i++) {
adjList[i] = new ArrayList<>();
}
for (int i = 0; i < m; i++) {
st = new StringTokenizer(br.readLine());
int source = Integer.parseInt(st.nextToken());
int dest = Integer.parseInt(st.nextToken());
int cost = Integer.parseInt(st.nextToken());
adjList[source].add(new Node(dest, cost));
}
long[] dist = new long[n + 1];
Arrays.fill(dist, Integer.MAX_VALUE);
dist[1] = 0;
// v-1 번 반복해서 간선 업데이트
for (int i = 0; i < n - 1; i++) {
for (int j = 1; j <= n; j++) {
for (Node node : adjList[j]) {
if (dist[j] != Integer.MAX_VALUE && dist[node.dest] > dist[j] + node.cost) {
dist[node.dest] = dist[j] + node.cost;
}
}
}
}
// 한번 더 반복해서 값이 변했으면 -1 즉 음의 사이클 존재
boolean hasNegativeCycle = false;
outer:
for (int j = 1; j <= n; j++) {
for (Node node : adjList[j]) {
if (dist[j] != Integer.MAX_VALUE && dist[node.dest] > dist[j] + node.cost) {
System.out.println("-1");
hasNegativeCycle = true;
break outer; // 음의 사이클 발견 시 바로 종료
}
}
}
// 음의 사이클이 없으면 결과 출력
if (!hasNegativeCycle) {
StringBuilder sb = new StringBuilder();
for (int i = 2; i <= n; i++) {
if (dist[i] == Integer.MAX_VALUE) {
sb.append("-1\n");
} else {
sb.append(dist[i]).append("\n");
}
}
System.out.print(sb);
}
}
}
'코테적 감자 > 백준' 카테고리의 다른 글
[백준-java] 3613번 실버 3 java vs c++ (0) | 2024.11.17 |
---|---|
[백준-java] 9996번 실버 3 한국이 그리울 땐 서버에 접속하지 (1) | 2024.11.16 |
[SWEA-java] 미생물 격리 (2) | 2024.11.15 |
[백준-java] 골드 4 최단 경로 (2) | 2024.11.07 |
[백준] 실버 4 요세푸스 (0) | 2024.11.03 |