[다익스트라] - G3_11779_최소 비용 구하기2

2023. 5. 17. 14:04· 알고리즘/문제
목차
  1. 🔥 - Java 코드

https://www.acmicpc.net/problem/11779

 

11779번: 최소비용 구하기 2

첫째 줄에 도시의 개수 n(1≤n≤1,000)이 주어지고 둘째 줄에는 버스의 개수 m(1≤m≤100,000)이 주어진다. 그리고 셋째 줄부터 m+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그 버스

www.acmicpc.net

 

📌 - 처음 생각한 풀이

  1. 도시와의 거리 = 시작지점을 제외하고는 전부 int 최댓값 초기화 , 이전도시 정보 배열 초기화
  2. 인접리스트를 이용해서 리스트에 인접한 도시와 비용을 객체로 추가
  3. bfs로 도시들을 방문
    - 비용이 최소일 때만 업데이트
    - 업데이트 할 때 그 비용은 dp배열에 저장하고 해당도시를 방문하기 전 도시를 result배열에 저장
  4. result 배열을 역순으로 출력

 

처음 푼 코드는 답이 정확하게 나왔지만 메모리초과가 계속 발생해서 애를 먹었는데, 알고보니 bfs로 탐색을 할 때, 

백준에 있는 값으로 예시를 들면 1번 도시에서 2,3,4,5번에 전부 접근이 가능하기 때문에 큐에 2,3,4,5도시의 경로와 비용이 함께 들어가게된다. | (2,2),(3,3),(4,1),(5,10) |

 

 

해당 4번 도시를 방문해서 4번 도시의 인접 도시를 찾아서 계산할때 이미 5번 도시는 최소 경로인 4로 변경이 되지만 아직 큐에 (5,10)이 남아있는데 이 경우를 연산에 포함하지 않게 해야 메모리나 시간초과를 넘길 수 있다.

 

해당 코드를 구현하지 않으면 문제를 틀리게 된다.

 

 

🔥 - Java 코드

 


  
package 그래프탐색.G3_11779_최소비용구하기2;
import java.io.*;
import java.util.*;
class Line{
int x;
int cost;
Line(int x , int cost){
this.x=x;
this.cost=cost;
}
}
public class Main {
public static int n,m;
public static List<ArrayList<Line>> line;
public static int[] dp,result;
public static void main(String[] args) throws IOException {
//BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedReader br = new BufferedReader(new FileReader("src/input.txt"));
StringTokenizer st = new StringTokenizer(br.readLine());
StringBuilder sb = new StringBuilder();
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(br.readLine());
line = new ArrayList<>();
dp = new int[n+1];
result = new int[n+1];
for (int i =0;i<n+1;i++){
line.add(new ArrayList<Line>());
}
// 그래프에 인접도시 객체 추가
for(int i=0;i<m;i++){
st = new StringTokenizer(br.readLine());
int a,b,cost;
a = Integer.parseInt(st.nextToken());
b = Integer.parseInt(st.nextToken());
cost = Integer.parseInt(st.nextToken());
line.get(a).add(new Line(b,cost));
}
st = new StringTokenizer(br.readLine());
int sC = Integer.parseInt(st.nextToken());
int sA = Integer.parseInt(st.nextToken());
// 거리 값 전부 최댓값으로 초기화
Arrays.fill(dp, Integer.MAX_VALUE);
dp[sC] = 0;
bfs(sC); // 다익스트라 시작
int count =0;
System.out.println(dp[sA]);
while(dp[sA] != 0){
count++;
sb.insert(0,sA + " ");
sA = result[sA];
}
sb.insert(0,sC+ " ");
System.out.println(count+1);
System.out.println(sb);
}
public static void bfs(int start){
Queue<Line> q = new LinkedList<>();
q.add(new Line(start,0));
while(!q.isEmpty()){
Line x = q.poll();
int cur = x.x;
if(dp[cur] < x.cost){ // ******** 위쪽에서 예시를 든 핵심 코드가 이것이다. 이 코드가 없으면 메모리나 시간초과가 나온다.
continue;
} // ***********
for(int i =0;i<line.get(cur).size();i++){
int nx =line.get(cur).get(i).x;
int nc = line.get(cur).get(i).cost;
if(dp[nx] > nc+dp[cur]){ //
dp[nx] = nc+dp[cur];
result[nx] = cur;
q.add(new Line(nx,dp[nx]));
}
}
}
}
}
  1. 🔥 - Java 코드
'알고리즘/문제' 카테고리의 다른 글
  • [구현] - G5_21608_상어 초등학교
  • [BFS] - G5_13549_숨바꼭질 3
  • [구현] - G4_17144_미세먼지 안녕!
  • [그리디] - S3_2012_등수매기기
Casteira
Casteira
할 뿐
Casteira
SpongeCake
Casteira
전체
오늘
어제
  • __Main__ (104)
    • 알고리즘 (65)
      • 개념 (6)
      • 문제 (58)
    • 컴퓨터 구조 (9)
      • 자료 구조 (2)
      • OS (7)
    • 웹 (1)
      • 자바 (1)
      • 스프링 (5)
      • SQL (0)
    • 기록 (4)
      • 포트폴리오 (2)
    • 정글 (18)
      • TIL (17)

블로그 메뉴

  • 🗒️ 깃허브
  • 태그
  • 방명록
  • 관리

공지사항

인기 글

태그

  • annotation
  • 백준
  • java
  • 정글
  • 크래프톤 정글
  • dp
  • spring
  • 크래프톤
  • framework
  • 코딩테스트
  • 백준 골드
  • springboot

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.1
Casteira
[다익스트라] - G3_11779_최소 비용 구하기2
테마상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.