Algorithm πŸ§‘πŸ»‍πŸ’»/λ°±μ€€(BOJ)

[λ°±μ€€,c++] 11780번 - ν”Œλ‘œμ΄λ“œ2

dkswnkk 2021. 10. 31. 20:08
 

11780번: ν”Œλ‘œμ΄λ“œ 2

첫째 쀄에 λ„μ‹œμ˜ 개수 n이 μ£Όμ–΄μ§€κ³  λ‘˜μ§Έ μ€„μ—λŠ” λ²„μŠ€μ˜ 개수 m이 μ£Όμ–΄μ§„λ‹€. 그리고 μ…‹μ§Έ 쀄뢀터 m+2μ€„κΉŒμ§€ λ‹€μŒκ³Ό 같은 λ²„μŠ€μ˜ 정보가 μ£Όμ–΄μ§„λ‹€. λ¨Όμ € μ²˜μŒμ—λŠ” κ·Έ λ²„μŠ€μ˜ 좜발 λ„μ‹œμ˜ λ²ˆν˜Έκ°€

www.acmicpc.net

#include <iostream>
#include <vector>
#define INF 1e9     //λ¬΄ν•œμ„ μ˜λ―Έν•˜λŠ” κ°’μœΌλ‘œ 10얡을 μ§€μ • 

using namespace std;

int graph[101][101];
int n, m,cnt;    //n=λ„μ‹œμ˜ 개수, m=λ²„μŠ€μ˜ 개수
int path[101][101];

void findCost(int a, int b)    {    //κ²½λ‘œμ— ν¬ν•¨λœ λ„μ‹œμ˜ 개수λ₯Ό κ΅¬ν•˜λŠ” ν•¨μˆ˜
    if (path[a][b] != INF) {
        cnt++;
        findCost(a, path[a][b]);
        findCost(path[a][b], b);
    }
}

void findPath(int a, int b) {    //μž¬κ·€μ μœΌλ‘œ ν˜ΈμΆœν•˜λ©΄μ„œ 경둜λ₯Ό 좜λ ₯ν•˜λŠ” ν•¨μˆ˜
    if (path[a][b] != INF) {
        findPath(a, path[a][b]);
        cout << path[a][b] << ' ';
        findPath(path[a][b], b);
    }
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cin >> n >> m;

    for (int i = 0; i < 101; i++) {        //μ΅œλ‹¨ 거리 ν…Œμ΄λΈ”μ„ λ¬΄ν•œμœΌλ‘œ μ΄ˆκΈ°ν™”;
        fill(graph[i], graph[i] + 101, INF);
        fill(path[i], path[i] + 101, INF);
    }

    for (int a = 1; a <= n; a++) {        //자기 μžμ‹ μ—μ„œ 자기 μžμ‹ μœΌλ‘œ κ°€λŠ” λΉ„μš©μ€ 0
        for (int b = 1; b <= n; b++) {
            if (a == b) {
                graph[a][b] = 0;
                path[a][b] = 0;
            }
        }
    }


    for (int i = 0; i < m; i++) {    //κ°„μ„  정보 μž…λ ₯
        int a, b, c; cin >> a >> b >> c;
        graph[a][b] = min(graph[a][b], c);    //aμ—μ„œ bκΉŒμ§€ κ°€λŠ”λ° c만큼의 λΉ„μš©μ΄ λ“ λ‹€.
    }

    for (int k = 1; k <= n; k++) {        //ν”Œλ‘œμ΄λ“œ-와샬 μ•Œκ³ λ¦¬μ¦˜ μˆ˜ν–‰
        for (int a = 1; a <= n; a++) {
            for (int b = 1; b <= n; b++) {
                if (graph[a][k] + graph[k][b] < graph[a][b]) {
                    graph[a][b] = graph[a][k] + graph[k][b];
                    path[a][b] = k;
                }
            //    graph[a][b] = min(graph[a][b], graph[a][k] + graph[k][b]);
            }

        }
    }
    for (int a = 1; a <= n; a++) {        //i->j둜 κ°€λŠ”λ° ν•„μš”ν•œ μ΅œμ†Œ λΉ„μš© 좜λ ₯    
        for (int b = 1; b <= n; b++) {
            if (graph[a][b] == INF) cout << 0 << ' ';
            else cout << graph[a][b] << ' ';
        }
        cout << "\n";
    }

    for (int a = 1; a <= n; a++) {
        for (int b = 1; b <= n; b++) {
            if (graph[a][b] == INF||a==b) cout << 0<<'\n';
            else {
                cnt = 2;    //μ‹œμž‘κ³Ό 끝은 무쑰건 μ§€λ‚˜λ―€λ‘œ 2λΆ€ν„° μ‹œμž‘
                findCost(a, b);
                cout << cnt << ' ' << a << ' ';
                findPath(a, b);
                cout << b << "\n";
            }
        }
    }


}