[백준 1916] 최소비용 구하기(C++)

2022. 8. 13. 21:50· CodingTest/Baekjoon
목차
  1. 🔎문제해석
  2. 💡구현
  3. 📃코드
  4. ✔느낀 점

문제

N개의 도시가 있다. 그리고 한 도시에서 출발하여 다른 도시에 도착하는 M개의 버스가 있다. 우리는 A번째 도시에서 B번째 도시까지 가는데 드는 버스 비용을 최소화시키려고 한다. A번째 도시에서 B번째 도시까지 가는데 드는 최소비용을 출력하여라. 도시의 번호는 1부터 N까지이다.


입력

첫째 줄에 도시의 개수 N(1 ≤ N ≤ 1,000)이 주어지고 둘째 줄에는 버스의 개수 M(1 ≤ M ≤ 100,000)이 주어진다. 그리고 셋째 줄부터 M+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그 버스의 출발 도시의 번호가 주어진다. 그리고 그다음에는 도착지의 도시 번호가 주어지고 또 그 버스 비용이 주어진다. 버스 비용은 0보다 크거나 같고, 100,000보다 작은 정수이다.

그리고 M+3째 줄에는 우리가 구하고자 하는 구간 출발점의 도시 번호와 도착점의 도시 번호가 주어진다. 출발점에서 도착점을 갈 수 있는 경우만 입력으로 주어진다.


출력

첫째 줄에 출발 도시에서 도착 도시까지 가는데 드는 최소 비용을 출력한다.


🔎문제해석

전형적인 다익스트라 알고리즘 문제이다.

다익스트라 알고리즘을 잘 이해하고 있다면 쉽게 푸는 문제이다.

헷갈린 부분은 출발지부터 도착지까지의 같은 경로에 버스가 여러 대 존재한다는 사실이 문제에 명시되어있지 않아서 그 부분이 좀 짜증 났다.


💡구현

⚡변수 선언

  1. grpah는 버스 출발지와 도착지. 그리고 버스 비용을 저장하는 배열
  2. d는 거리 테이블
  3. visit은 방문 여부를 체크하는 배열
  4. location은 현재 내가 방문하기 이전의 도시를 적어줌.

⚡배열 입력하기

  1. INF는 의미 없는 엄청 큰 값으로 이렇게 선언한 이유는 우리는 항상 최소의 경로를 찾아야 하기 때문에 이렇게 초기값을 이렇게 선언했다.
  2. 배열의 크기는 1번부터 n번까지의 버스가 있기에 n+1로 초기화했다.
  3. 똑같은 경로에 여러 가지 비용의 버스 중에 가장 적은 버스를 넣어줬다.

⚡출발지를 기준으로 최소 경로 찾기.

  1. S와 F는 각각 출발지와 도착지를 의미함.
  2. location의 초기값은 출발지로 주고, 자기 자신에서 자신으로 가는 경로는 없기에 0으로 초기화함.

⚡다익스트라 함수

  1. 만약 visit값이 1이면 방문한 곳이기에 재귀를 종료함.
  2. 반복문을 1부터 n까지 도는데 만약 방문한 도시를 내가 도착지로 하려고 하면 continue를 실행함.
  3. 움직일 때마다 거리 테이블을 최신화하는데 만약 더 작은 값이 들어온다면 최신화해주고, location을 그 출발지로 바꿔줌.
  4. smallIdx를 통해서 가장 가까운 곳을 반환하고 그곳으로 이동함.

⚡최소 거리인 도착지를 반환해주는 함수.

  1. 반복문을 돌면서 방문 안 했고, 가장 가까운 지점인 도시를 반환함.

📃코드

/*
백준 골드 5 최소비용 구하기
*/
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
#define INF 987654321
int n, m, S, F;
vector<vector<int>> graph;
vector<int> d;
vector<int> visit;
vector<int> location;
void Dijkstra(int start);
int smallIdx(int start);
int main()
{
cin >> n >> m;
graph.resize(n + 1, vector<int>(n + 1, INF));
d.resize(n + 1, INF);
visit.resize(n + 1);
location.resize(n + 1);
for (int i = 0; i < m; i++)
{
int s, f, v;
cin >> s >> f >> v;
graph[s][f] = min(graph[s][f], v);
}
cin >> S >> F;
d[S] = 0;
for (int i = 1; i <= n; i++)
{
location[i] = S;
graph[i][i] = 0;
}
Dijkstra(S);
cout << d[F];
//출발지와 도착점이 정해진다.
//처음 출발지를 기준으로 distance 배열을 만들자
//출발점 기준으로 distance넣기.
}
void Dijkstra(int start)
{
if (visit[start] == 1)
{
return;
}
visit[start] = 1;
for (int i = 1; i <= n; i++)
{
//만약 d[i]가 크다면 넣어줘야겟죠?
if (visit[i] == 1)
{
continue;
}
if (d[i] > graph[start][i])
{
d[i] = min(d[i], graph[start][i] + d[start]); //현재 지점이 start, 이전에 있던 곳이 location[start]
location[i] = start;
}
// d[i]가 출발노드에서 가는 거리보다 작다면 업데이트 해줄 필요가 없음.
}
int arrive = smallIdx(start);
if (arrive == 0)
{
return;
}
Dijkstra(arrive);
}
int smallIdx(int start)
{
int MAX = INF;
int sidx = 0;
for (int i = 1; i < d.size(); i++)
{
if (i == start || visit[i] == 1)
{
continue;
}
if (d[i] < MAX)
{
sidx = i;
MAX = d[i];
}
}
return sidx;
}

✔느낀 점

  • 문제를 풀기 전에 다익스트라 알고리즘을 공부하고 푸니까 훨씬 수월했다.
  • 최댓값 선정과 여러 개의 버스가 있다는 것 빼고는 문제는 쉬웠다.
  • 골드 4 치고는 알고리즘만 알면 쉽게 풀 수 있는 문제!
저작자표시 (새창열림)

'CodingTest > Baekjoon' 카테고리의 다른 글

[백준 1753] 최단경로(C++)  (0) 2022.08.16
[백준 17396] 백도어(C++)  (0) 2022.08.15
[백준 1446] - 지름길(C++)  (0) 2022.08.12
[백준 11404] 플루이드(C++)  (0) 2022.08.09
[백준 2606] 바이러스(C++)  (0) 2022.08.06
  1. 🔎문제해석
  2. 💡구현
  3. 📃코드
  4. ✔느낀 점
'CodingTest/Baekjoon' 카테고리의 다른 글
  • [백준 1753] 최단경로(C++)
  • [백준 17396] 백도어(C++)
  • [백준 1446] - 지름길(C++)
  • [백준 11404] 플루이드(C++)
재한
재한
안녕하세요 💻
재한
짜이한
전체
오늘
어제
  • 분류 전체보기 (502)
    • Skils (116)
      • Android (50)
      • C++ (5)
      • Kotlin (36)
      • Algorithm (24)
      • Server (1)
    • CodingTest (228)
      • Programmers (45)
      • Baekjoon (183)
    • Experience (8)
      • 후기(코딩테스트,프로그램,프로젝트) (8)
    • Computer Science (70)
      • Design Pattern (2)
      • OOP (2)
      • Computer Architecture (14)
      • OS (2)
      • Software Engineering (3)
      • DataBase (8)
      • Network (39)
    • 학교 (75)
      • R프로그래밍 (26)
      • 회계와 사회생활 (17)
      • 컴퓨터학개론 (20)
      • it기술경영개론 (12)

블로그 메뉴

  • 홈
  • 태그
  • 카테고리
  • 글쓰기
  • 설정

인기 글

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
재한
[백준 1916] 최소비용 구하기(C++)
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

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

블로그 게시글

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

모든 영역

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

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