일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- 백준 1043번 거짓말 - java 분리 집합
- toUpperCase
- 18111번 마인크래프트 - java 구현
- 코틀린기초
- StringBuilder
- 프로그래머스 java
- HashMap
- 프로그래머스
- 프로그래머스 자바
- Stack
- map
- dp
- Java
- 백준 1806번 부분합 java
- mysql hy000 에러
- hash
- 백준 2467번 용액 자바 - 이분탐색
- StringTokenizer
- 최소 힙 1927
- HashSet
- 백준 1541
- ac 5430번
- replace()
- append
- kotlin
- 백준 1647번 도시 분할 계획 - java
- 백준 3190번
- 백준 1197번 최소 스패닝 트리 - java
- 백준 2473번 세 용액 - java
- 백준 14938번 서강그라운드
Archives
- Today
- Total
말하는 컴공감자의 텃밭
백준 1956번 운동 G4 - 플로이드 워셜 자바 본문
728x90
아 집중 좀 하고 풀껄
후딱 풀거같아서 설렁설렁 확인하다 한참 걸린 문제다. 별것도 아닌게
스터디 재밌당 ^<^
DP 문제 하려다 갑자기 땡겨서 누른 문제였다.. 왜그랬을까
간선에 가중치있는 그래프에서 최소경로를 찾을때는 플로이드 위샬을 사용했었다.
플로이드 워셜은 i 경로에서 j 경로까지 k를 통해 모든 경로를 업데이트하기 때문이다.
시간 복잡도는 이중 삼중 for문이기에 O(n³) 이다.
사이클을 찾는것을 확인하려면 i부터 j까지 갱신된 값이 존재한다면 사이클이 있다는 것이고,
초기에 세팅한 값이라면 -1 을 출력해주면 된다
간단하게 해결할 줄 알았는데...
Math.max 오타 한번내고, 조건을 잘못 넣었어서 한참 걸렸었다..
if (arr[i][j] != max && arr[j][i] != max)
플로이드 워셜로 값 갱신할때 이 조건을 넣었었는데 사이클 찾을때만 필요했지
오히려 업데이트를 안해버려서 문제가 생겼었다.
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | import java.io.*; import java.util.StringTokenizer; public class Main {// Boj_1956_운동 // 플로이드 워샬 예제 public static int V, N, a, b, c, answer, max; public static int[][] arr; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); V = Integer.parseInt(st.nextToken()); N = Integer.parseInt(st.nextToken()); arr = new int[V + 1][V + 1]; max = 1000000000; for (int i = 1; i <= V; i++) { for (int j = 1; j <= V; j++) { arr[i][j] = max; } } for (int i = 0; i < N; i++) { st = new StringTokenizer(br.readLine()); a = Integer.parseInt(st.nextToken()); // start b = Integer.parseInt(st.nextToken()); // end c = Integer.parseInt(st.nextToken()); // cost arr[a][b] = c; } // 플로이드 워샬 for (int k = 1; k <= V; k++) { for (int i = 1; i <= V; i++) { for (int j = 1; j <= V; j++) { arr[i][j] = Math.min(arr[i][k] + arr[k][j], arr[i][j]); } } } answer = max; // 사이클을 찾아준다. for (int i = 1; i <= V; i++) { // 시작점 for (int j = 1; j <= V; j++) { // 끝점 if (arr[i][j] != max && arr[j][i] != max) { answer = Math.min(answer, arr[i][j] + arr[j][i]); } } } answer = max == answer ? -1 : answer; System.out.println(answer); } } | cs |
에잉..
728x90
'알고리즘 > Backjoon - Java' 카테고리의 다른 글
백준 2792번 보석상자 S1 - java 이분 탐색 (0) | 2024.03.18 |
---|---|
백준 2156번 포도주 시식 S1 - DP (0) | 2024.03.18 |
백준 31423번 신촌 통폐합 계획 G5 - 그래프, 연결 리스트 (0) | 2024.02.23 |
백준 1106번 호텔 G5 - DP (0) | 2024.02.23 |
백준 G3 히호^<^ (0) | 2024.02.23 |
Comments