๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“š ์ „๊ณต ๊ณต๋ถ€/์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ•ด์„ ๋ฐ ์„ค๊ณ„

[์•Œ๊ณ ๋ฆฌ์ฆ˜] ๊ทธ๋ž˜ํ”„ - ์ตœ๋‹จ๊ฑฐ๋ฆฌ ๊ตฌํ•˜๊ธฐ(cpp)

by xxilliant 2023. 4. 11.
728x90
๋ฐ˜์‘ํ˜•

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;
}

 

728x90
๋ฐ˜์‘ํ˜•