𝘚𝘭𝘰𝘸 𝘣𝘢𝘡 𝘴𝘡𝘦𝘒π˜₯𝘺

[λ°±μ€€] 11404번: ν”Œλ‘œμ΄λ“œ - C++ λ³Έλ¬Έ

μ½”λ”©ν…ŒμŠ€νŠΈ μ€€λΉ„/λ°±μ€€

[λ°±μ€€] 11404번: ν”Œλ‘œμ΄λ“œ - C++

.23 2022. 1. 20. 16:51
문제

n(2 ≤ n ≤ 100)개의 λ„μ‹œκ°€ μžˆλ‹€. 그리고 ν•œ λ„μ‹œμ—μ„œ μΆœλ°œν•˜μ—¬ λ‹€λ₯Έ λ„μ‹œμ— λ„μ°©ν•˜λŠ” m(1 ≤ m ≤ 100,000)개의 λ²„μŠ€κ°€ μžˆλ‹€. 각 λ²„μŠ€λŠ” ν•œ 번 μ‚¬μš©ν•  λ•Œ ν•„μš”ν•œ λΉ„μš©μ΄ μžˆλ‹€.

λͺ¨λ“  λ„μ‹œμ˜ 쌍 (A, B)에 λŒ€ν•΄μ„œ λ„μ‹œ Aμ—μ„œ B둜 κ°€λŠ”λ° ν•„μš”ν•œ λΉ„μš©μ˜ μ΅œμ†Ÿκ°’μ„ κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

 

μž…λ ₯

첫째 쀄에 λ„μ‹œμ˜ 개수 n이 주어지고 λ‘˜μ§Έ μ€„μ—λŠ” λ²„μŠ€μ˜ 개수 m이 주어진닀. 그리고 μ…‹μ§Έ 쀄뢀터 m+2μ€„κΉŒμ§€ λ‹€μŒκ³Ό 같은 λ²„μŠ€μ˜ 정보가 주어진닀. λ¨Όμ € μ²˜μŒμ—λŠ” κ·Έ λ²„μŠ€μ˜ 좜발 λ„μ‹œμ˜ λ²ˆν˜Έκ°€ 주어진닀. λ²„μŠ€μ˜ μ •λ³΄λŠ” λ²„μŠ€μ˜ μ‹œμž‘ λ„μ‹œ a, 도착 λ„μ‹œ b, ν•œ 번 νƒ€λŠ”λ° ν•„μš”ν•œ λΉ„μš© c둜 이루어져 μžˆλ‹€. μ‹œμž‘ λ„μ‹œμ™€ 도착 λ„μ‹œκ°€ 같은 κ²½μš°λŠ” μ—†λ‹€. λΉ„μš©μ€ 100,000보닀 μž‘κ±°λ‚˜ 같은 μžμ—°μˆ˜μ΄λ‹€.

μ‹œμž‘ λ„μ‹œμ™€ 도착 λ„μ‹œλ₯Ό μ—°κ²°ν•˜λŠ” 노선은 ν•˜λ‚˜κ°€ 아닐 수 μžˆλ‹€.

 

좜λ ₯

n개의 쀄을 좜λ ₯ν•΄μ•Ό ν•œλ‹€. i번째 쀄에 좜λ ₯ν•˜λŠ” j번째 μˆ«μžλŠ” λ„μ‹œ iμ—μ„œ j둜 κ°€λŠ”λ° ν•„μš”ν•œ μ΅œμ†Œ λΉ„μš©μ΄λ‹€. λ§Œμ•½, iμ—μ„œ j둜 갈 수 μ—†λŠ” κ²½μš°μ—λŠ” κ·Έ μžλ¦¬μ— 0을 좜λ ₯ν•œλ‹€.

 


λͺ¨λ“  μ΅œλ‹¨ 경둜λ₯Ό κ΅¬ν•˜λŠ” ν”Œλ‘œμ΄λ“œ 와샬 μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ ν‘ΈλŠ” 문제.

 

λ¬΄ν•œλŒ€μΈ INF값을 λ„ˆλ¬΄ μž‘μ€ κ°’μœΌλ‘œ 작게 되면 κ²½λ‘œκ°€ μ—†μ–΄ 0으둜 좜λ ₯ν•΄μ•Ό ν•˜λŠ” 곳인지 μ œλŒ€λ‘œ νŒλ³„ν•  수 μ—†μœΌλ―€λ‘œ 100,000 * 100 = 10,000,000 보닀 큰 κ°’μœΌλ‘œ μž‘μ•„μ€˜μ•Ό ν•œλ‹€.

 

μ½”λ“œ
#include <cstdio>
#define MAX 101
#define INF 10000001

using namespace std;

int route[MAX][MAX];
int N, K;

int main(void) {
    scanf("%d %d", &N, &K);
    
    for(int i = 0; i < MAX; i++) {
        for(int j = 0; j < MAX; j++) {
            route[i][j] = INF;
        }
    }

    for(int i = 0; i < K; i++) {
        int a, b, c;
        scanf("%d %d %d", &a, &b, &c);
        if(route[a][b] > c) {
            route[a][b] = c;
        }
    }

    for(int k = 1; k <= N; k++) {
        for(int i = 1; i <= N; i++) {
            for(int j = 1; j <= N; j++) {
                if(route[i][k] + route[k][j] < route[i][j]) {
                    route[i][j] = route[i][k] + route[k][j];
                }
            }
        }
    }

    for(int i = 1; i <= N; i++) {
        for(int j = 1; j <= N; j++) {
            if(i == j || route[i][j] >= INF) printf("0 ");
            else printf("%d ", route[i][j]);
        }
        printf("\n");
    }
    return 0;
}
Comments