BOJ 1446 지름길

2020. 12. 16. 01:40·알고리즘/BOJ

www.acmicpc.net/problem/1446

 

1446번: 지름길

첫째 줄에 지름길의 개수 N과 고속도로의 길이 D가 주어진다. N은 12 이하이고, D는 10,000보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에 지름길의 시작 위치, 도착 위치, 지름길의 길이가 주

www.acmicpc.net

 

문제는 그리디 하게 접근해야 한다는 것이다. 그냥 지름길이 주어졌다고 해서 지금 길만 탄다면

다른 컴포넌트에 있는 길로 가는 것이 더 빠를 수 있다.

 

어떻게 접근해야 할까?

 

핵심은 다익스트라를 돌리면서 현재 위치 + 1 에 지름길이 없다면 우선순위 큐에 

cost + 1 로 넣어주는 것이다.

 

이렇게 되면 자연히 d 이하의 모든 노드를 탐색하면서 지름길이 있다면 지름길을 타고, 아니라면

다음 컴포넌트가 큐에 들어가게 된다.

 

 

1
2
3
4
if (cur + 1 <= k && d[cur + 1] > cost + 1) {
    d[cur + 1] = cost + 1;
    q.push({ -(cost + 1),cur + 1 });
}
Colored by Color Scripter
cs

 

k 가 고속도로의 길이 d라고 하면 현재 위치 cur + 1 이 k보다 작아야 하고(고속도로를 역주행할 수는 없기 때문에)

그다음 위치가 현 비용 + 1 보다 크다면(INF라면) 

다른 컴포넌트이기 때문에 그 위치를 큐에 넣어줘야 한다.

 

 

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
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
 
vector<pair<int, int>> a[10001];
priority_queue<pair<int, int>> q;
const int inf = 1e9;
int n, k;
 
int dijkstra(int s, int e) {
    vector<int> d(10001, inf);
    q.push({ 0,s });
    d[s] = 0;
 
    while (!q.empty()) {
        auto cur = q.top().second;
        int cost = -q.top().first;
        q.pop();
        if (d[cur] < cost) continue;
        for (auto i : a[cur]) {
            int nc = cost + i.second;
            if (nc < d[i.first]) {
                d[i.first] = nc;
                q.push({ -nc,i.first });
            }
        }
        if (cur + 1 <= k && d[cur + 1] > cost + 1) {
            d[cur + 1] = cost + 1;
            q.push({ -(cost + 1),cur + 1 });
        }
    }
    return d[e];
}
 
int main() {
    ios::sync_with_stdio(false); cin.tie(0);
 
    cin >> n >> k;
    for (int i = 0; i < n; ++i) {
        int x, y, z; cin >> x >> y >> z;
        a[x].push_back({ y,z });
    }
 
    cout << dijkstra(0, k) << endl;
 
    return 0;
}
Colored by Color Scripter
cs

 

 

'알고리즘 > BOJ' 카테고리의 다른 글

BOJ 15686 치킨 배달  (0) 2020.12.25
BOJ 3190 뱀  (0) 2020.12.19
BOJ 1915 가장 큰 정사각형  (0) 2020.12.13
BOJ 7579 앱  (0) 2020.12.13
BOJ 5052 전화번호 목록  (0) 2020.12.10
'알고리즘/BOJ' 카테고리의 다른 글
  • BOJ 15686 치킨 배달
  • BOJ 3190 뱀
  • BOJ 1915 가장 큰 정사각형
  • BOJ 7579 앱
khyu2
khyu2
  • khyu2
    dev log
    khyu2
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 알고리즘
        • BOJ
        • Programmers
        • Algorithm
        • SWEA
      • 개발
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    피보나치 수
    행렬 제곱
    조합
    우선순위 큐
    MST
    냅색
    GREEDY
    이분 탐색
    팰린드롬
    크루스칼
    구현
    완전탐색
    dp
    프로그래머스
    코딩테스트 연습
    dfs
    SWEA
    큐
    시뮬레이션
    유니온 파인드
    BFS
    트리
    완전 탐색
    BOJ
    소수
    알고리즘
    피사노 주기
    이분탐색
    분할 정복
    다익스트라
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
khyu2
BOJ 1446 지름길
상단으로

티스토리툴바