본문 바로가기

BOJ 11657번 : 타임머신 본문

BOJ

BOJ 11657번 : 타임머신

00rigin 2022. 4. 5. 16:43

그래프로 표현했을 때 간선이 음수의 값을 가지고, cycle을 찾아내야 하므로 벨만-포드 알고리즘을 사용해야 한다.

https://00rigin.tistory.com/57

 

벨만포드 알고리즘

다익스트라 알고리즘은 O(NlongN) 안에 한 노드에서 다른 모든 노드에 대한 최단 거리를 찾을 수 있다. 벨만-포드 알고리즘의 경우 O(N^2)으로 최단 거리를 찾는다. 벨만-포드 알고리즘이 존재하는

00rigin.tistory.com

 

<소스코드>

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
72
73
#include <iostream>
#include <vector>
#include <queue>
#include <climits>
 
using namespace std;
 
int N,M;
vector<pair<int,int>> v[501];
vector<long long> d;
 
bool cir = false// cycle 표시용
 
void bell(int s){
    
    d[s] = 0;
    
    for(int i = 1; i<=N; i++){ // i == N(노드 갯수) 까지 오면 cycle을 돌고 있는 것!
        for(int j = 1; j<=N; j++){ // 각 노드를 방문하여 탐색 
            for(auto &n : v[j]){
                if(d[j] == LONG_LONG_MAX) continue// 한번 방문했던 노드만
                if(d[n.first] > n.second + d[j]){
                    d[n.first] = n.second + d[j];
                    if(i == N){
                        cir = true;
                        
                    }
                }
                
            }
        }
    }
    
    
}
 
 
int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    
    cin>>N>>M;
    
    for(int i = 1; i<=M; i++){
        int a,b,c;
        cin>>a>>b>>c;
        
        v[a].push_back(make_pair(b,c));
        
    }
    
    for(int i = 0; i<=N+1; i++){
        d.push_back(LONG_LONG_MAX);
    }
    
    bell(1);
    
    if(cir == true){
        cout<<"-1"<<endl;
    }
    else{
        for(int i = 2; i <=N; i++){
            if(d[i] == LONG_LONG_MAX)
                cout<<"-1"<<endl;
            else
                cout<<d[i]<<endl;
        }
    }
    
    
    
}
 
cs

 

<문제>

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

 

11657번: 타임머신

첫째 줄에 도시의 개수 N (1 ≤ N ≤ 500), 버스 노선의 개수 M (1 ≤ M ≤ 6,000)이 주어진다. 둘째 줄부터 M개의 줄에는 버스 노선의 정보 A, B, C (1 ≤ A, B ≤ N, -10,000 ≤ C ≤ 10,000)가 주어진다. 

www.acmicpc.net

 

'BOJ' 카테고리의 다른 글

BOJ 2798 블랙잭  (0) 2023.08.08
BOJ 1647번 : 도시 분할 계획  (0) 2022.04.07
BOJ 1504번 : 특정한 최단 경로  (0) 2022.04.02
BOJ 1753번 : 최단경로  (0) 2022.03.30
BOJ 13975번 : 파일 합치기3  (0) 2022.03.26
Comments