λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

πŸ“š 전곡 곡뢀/μ•Œκ³ λ¦¬μ¦˜ 해석 및 섀계

[μ•Œκ³ λ¦¬μ¦˜] κ·Έλž˜ν”„ - μ΅œλ‹¨κ±°λ¦¬ κ΅¬ν•˜κΈ°(cpp)

N개의 λ…Έλ“œμ™€ M개의 에지가 μžˆλŠ” κ·Έλž˜ν”„μ—μ„œ, μ„Έ λ…Έλ“œ s, a, tκ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ sμ—μ„œ aλ₯Ό λ°˜λ“œμ‹œ μ§€λ‚˜μ„œ tκΉŒμ§€ λ„λ‹¬ν•˜λŠ” κ°€μž₯ 짧은 거리λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€. 

μž…λ ₯ 
ν‘œμ€€ μž…λ ₯으둜 μž…λ ₯을 λ°›λŠ”λ‹€. 첫 μ€„μ—λŠ” λ…Έλ“œμ˜ 개수 Nκ³Ό μ—μ§€μ˜ 개수 M이 주어진닀. λ…Έλ“œμ˜ κ°œμˆ˜λŠ” 3 이상 100 μ΄ν•˜μ΄κ³ , μ—μ§€μ˜ κ°œμˆ˜λŠ” 0개 이상 N(N-1)개 μ΄ν•˜μ΄λ‹€. 
λ‘λ²ˆμ§Έ μ€„μ—λŠ” μ„Έ μ •μˆ˜ s a tκ°€ 주어진닀. λ…Έλ“œλ“€μ€ 0 이상 N 미만인 μ •μˆ˜λ“€λ‘œ ν‘œν˜„λ˜λ©°, 이 μ„Έμ •μˆ˜λŠ” 각각 μ‹œμž‘ λ…Έλ“œ, 쀑간 λ…Έλ“œ, 도착 λ…Έλ“œλ₯Ό λ‚˜νƒ€λ‚Έλ‹€. 
μ„Έλ²ˆμ§Έ 쀄뢀터 총 M쀄에 에지 정보가 주어진닀. ν•œ 쀄은 에지 ν•˜λ‚˜μ— λŒ€ν•œ 정보λ₯Ό λ‚˜νƒ€λ‚΄λ©°, μ„Έ μ •μˆ˜ U V W둜 이루어진닀. UλŠ” μ—μ§€μ˜ μ‹œμž‘ λ…Έλ“œ, VλŠ” μ—μ§€μ˜ 도착 λ…Έλ“œ, WλŠ” μ—μ§€μ˜ κ°€μ€‘μΉ˜μ΄λ‹€. 이 κ·Έλž˜ν”„λŠ” 유ν–₯ κ·Έλž˜ν”„μ΄λ©° μ—μ§€μ˜ κ°€μ€‘μΉ˜λŠ” -100 이상 100 μ΄ν•˜μΈ μ •μˆ˜μ΄λ‹€. U=V, 즉 μžμ‹ μ—μ„œ μžμ‹ μœΌλ‘œ μ΄μ–΄μ§€λŠ” μ—μ§€λŠ” μ—†μœΌλ©°, 이 κ·Έλž˜ν”„μ—λŠ” 음의 κ°€μ€‘μΉ˜λ₯Ό κ°–λŠ” 사이클이 μ—†λ‹€.

좜λ ₯ 
ν‘œμ€€ 좜λ ₯으둜 좜λ ₯ν•œλ‹€. ν•œ μ€„λ‘œ 좜λ ₯ν•˜κ³ , 이 μ€„μ—λŠ” sμ—μ„œ aλ₯Ό 거쳐 b둜 κ°€λŠ” μ΅œλ‹¨ 거리λ₯Ό 좜λ ₯ν•œλ‹€.    

예제 μž…λ ₯ 
4 6
0 2 3
0 1 2
0 2 3
0 3 1
1 2 -1
1 3 4
2 3 2
예제 좜λ ₯ 
3

 

bfs/dfs 문제 ν•œλ²ˆλ„ μ•ˆ 풀어봀을 λ•Œ λ‚˜μ˜¨ κ·Έλž˜ν”„ 과제...

μ΄λ•ŒλŠ” bfsκ°€ μ–΄λ €μ›Œμ„œ κ·Έλƒ₯ 반볡문으둜 μ—΄μ‹¬νžˆ ν’€μ—ˆλ‹€.

과거의 λ©μ²­ν•œ λ‚˜,, κ·Έλž˜λ„ 만점 받은거 보면 κ½€λ‚˜ λ˜‘λ˜‘ν–ˆμ„μ§€λ„

 

"음의 κ°€μ€‘μΉ˜λ₯Ό κ°–λŠ” '사이클'이 μ—†λ‹€"라고 ν–ˆμœΌλ―€λ‘œ Bellman Ford μ•Œκ³ λ¦¬μ¦˜μ„ 썼던걸둜 κΈ°μ–΅ν•œλ‹€.

s->a의 μ΅œλ‹¨κ±°λ¦¬λ₯Ό κ΅¬ν•˜κ³ , a->t의 μ΅œλ‹¨κ±°λ¦¬λ₯Ό κ΅¬ν•΄μ„œ λ”ν•΄μ£Όμ—ˆλ‹€.

 

 

#include <iostream>
#include <vector>
#include <string>
#include <queue>
#include <algorithm>
using namespace std;

int dist[101];
 
struct Edge {
    int s;
    int e;
    int val;
    Edge(int u, int v, int w) {
        s = u;
        e = v;
        val = w;
    }
};
 
int main() {
    ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
    int n, m; // λ…Έλ“œ, 에지
    int s, a, t; // μ‹œμž‘, 쀑간, 도착
    int u, v, w; // 에지 μ‹œμž‘λ…Έλ“œ, 에지 λ„μ°©λ…Έλ“œ, κ°€μ€‘μΉ˜
    cin >> n >> m >> s >> a >> t;
    vector<Edge> ed;

    for (int i = 0; i < m; ++i){
        cin >> u >> v >> w;
        ed.push_back(Edge(u, v, w));
    }

    for (int i = 0; i < n+1; i++) {
        dist[i] = 100000;
    }
    dist[s] = 0;
    for (int i = 0; i < n+1; i++) {
        for (int j = 0; j < ed.size(); j++) {
            int start = ed[j].s;
            int end = ed[j].e;
            int wei = ed[j].val;
            int newWei = dist[start] + wei;
            if (dist[start] != 100000 && newWei < dist[end]) {
                dist[end] = newWei;
            }
        }
    }
    // cout << "s_to_a = "<< dist[a] << "\n";
    int s_to_a = dist[a];
    if(s_to_a == 100000) { // κ²½μœ μ§€μ— 갈 수 없을 λ•Œ μ˜ˆμ™Έμ²˜λ¦¬
        exit(0);
    } 

    //
    for (int i = 0; i < n+1; i++) {
        dist[i] = 100000;
    }
    dist[a] = 0;
    for (int i = 0; i < n+1; i++) {
        for (int j = 0; j < ed.size(); j++) {
            int start = ed[j].s;
            int end = ed[j].e;
            int wei = ed[j].val;
            int newWei = dist[start] + wei;
            if (dist[start] != 100000 && newWei < dist[end]) {
                dist[end] = newWei;
            }
            
        }
    }
    // cout << "a_to_t = " << dist[t]<<"\n";
    int a_to_t = dist[t];
    if (a_to_t == 100000)
    { // κ²½μœ μ§€μ—μ„œ λ„μ°©μ μœΌλ‘œ 갈 수 없을 λ•Œ μ˜ˆμ™Έμ²˜λ¦¬
        exit(0);
    }
    cout << s_to_a + a_to_t;
    return 0;
}