Henu
개발냥발
Henu
전체 방문자
오늘
어제
  • 분류 전체보기 (411)
    • DevOps (52)
      • Kubernetes (19)
      • Docker (14)
      • AWS (3)
      • Nginx (4)
      • Linux (4)
      • ArgoCD (1)
      • CN (2)
      • NATS (0)
      • Git (5)
    • Back-End (30)
      • Django (18)
      • Spring (5)
      • JPA (1)
      • MSA (5)
    • CS (87)
      • SystemSoftware (20)
      • OS (25)
      • Computer Architecture (16)
      • Network (23)
      • Database (2)
    • Lang (21)
      • Java (9)
      • Python (4)
      • C# (8)
    • Life (12)
    • 블록체인 (2)
    • Algorithm (204)
      • BOJ (160)
      • 프로그래머스 (19)
      • LeetCode (4)
      • SWEA (1)
      • 알고리즘 문제 해결 전략 (8)
      • DS, algorithms (7)
      • Checkio (5)
    • IT (2)

블로그 메뉴

  • GitHub
  • 글쓰기
  • 관리자

공지사항

  • Free!

인기 글

태그

  • django
  • 다이나믹 프로그래밍
  • DFS
  • docker
  • Kubernetes
  • boj
  • 백트래킹
  • 프로그래머스
  • Network
  • BFS

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Henu

개발냥발

Algorithm/BOJ

[백준 1854] K번째 최단경로 찾기 (C++)

2021. 10. 31. 11:22
 

1854번: K번째 최단경로 찾기

첫째 줄에 n, m, k가 주어진다. (1 ≤ n ≤ 1000, 0 ≤ m ≤ 2000000, 1 ≤ k ≤ 100) n과 m은 각각 김 조교가 여행을 고려하고 있는 도시들의 개수와, 도시 간에 존재하는 도로의 수이다. 이어지는 m개의 줄에

www.acmicpc.net

 

다익스트라 알고리즘을 큰 변형없이 그냥 사용하면 되는 문제이다.

 

  다익스트라 알고리즘에서는 현재까지 구한 시간보다 다음 정점까지 가는데 걸리는 시간이 더 긴 경우에만 다음 정점을 탐색하고, 걸리는 시간을 갱신한다. 따라서 이 조건을 빼는 경우에는 N 정점에 도달하는 경우는 무수히 많아지게 될 것이다. 다익스트라에서는 다음 정점으로 가는 시간이 가장 적은 간선부터 탐색하기 때문에 이를 응용하면, 특정 정점에 도달할 때마다 도달하는데 걸리는 시간을 다 모아본다면 시간이 순차적으로 늘어나있음을 알 수 있다.

 

따라서 특정 정점(dist[i])에 도달하는 경우를 최대 K번까지만 반복한다면 K번째 최단경로를 구할 수 있다.

 

i라는 정점의 K번째 최단경로를 구하기 위해서 다른 정점의 K + a 번째 최단경로가 필요한 경우가 있지 않을까 하는 의문을 가지고 제출을 했었다. 그런데 그냥 맞았다고 뜨길래 반례 몇 개를 그려보고, K번째 최단 경로를 찾기 위해서 다른 정점의 K+a 번째의 최단경로가 당연히 필요없다고 이해했다. K번째를 찾는데 뭐하러 K+a번째를 찾아야하나 라는 의문이 왜 들었는지 모르겠다

 

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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
#include <cstring>
#define fasti ios_base::sync_with_stdio(false); cin.tie(0);
#define fastio ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define INF 2e9+7
#define pii pair<int, int>
 
typedef long long ll;
// typedef pair<int, int> pii;
 
using namespace std;
 
int N, M, K;
vector<pii > adj[1001];
vector<int> dist[1001];
 
void input(){
    cin >> N >> M >> K;
    int a, b, c;
    for(int i = 0; i < M; i++){
        cin >> a >> b >> c;
        adj[a].push_back({c, b});
    }
}
 
struct cmp{
    bool operator()(pii &a, pii &b){
        return a.first > b.first;
    }
};
 
void dijkstra(){
    priority_queue<pii, vector<pii >, cmp> pq; 
    pq.push({0, 1});
    
    while(!pq.empty()){
        int now = pq.top().second;
        int now_time = pq.top().first;
        pq.pop();
        
        dist[now].push_back(now_time);
        if(dist[now].size() > K) continue;
        
        for(int i = 0; i < adj[now].size(); i++){
            int next = adj[now][i].second;
            int next_time = now_time + adj[now][i].first;
            
            pq.push({next_time, next});
        }
    }
}
 
void solve(){
    dijkstra();
    for(int i = 1; i <= N; i++){
        if(dist[i].size() < K) cout << -1 << "\n";
        else cout << dist[i][K-1] << "\n";
    }
}
 
int main(){
    fastio
    input();
    solve();
    
    return 0;
}
 
Colored by Color Scripter
cs

 

'Algorithm > BOJ' 카테고리의 다른 글

[백준 1726] 로봇 (c++)  (0) 2021.11.20
[백준 1826] 연료 채우기 (C++)  (0) 2021.11.01
[백준 14595] 동방 프로젝트(Large) (C++)  (0) 2021.10.29
[백준 1941] 소문난 칠공주 (C++)  (0) 2021.10.25
[백준 1043] 거짓말 (C++)  (0) 2021.10.24
    'Algorithm/BOJ' 카테고리의 다른 글
    • [백준 1726] 로봇 (c++)
    • [백준 1826] 연료 채우기 (C++)
    • [백준 14595] 동방 프로젝트(Large) (C++)
    • [백준 1941] 소문난 칠공주 (C++)

    티스토리툴바