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

[λ°±μ€€] 1507번: κΆκΈˆν•œ 민호 - C++ λ³Έλ¬Έ

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

[λ°±μ€€] 1507번: κΆκΈˆν•œ 민호 - C++

.23 2022. 1. 21. 14:50
문제

κ°•ν˜ΈλŠ” N개의 λ„μ‹œλ‘œ 이루어진 λ‚˜λΌμ— μ‚΄κ³  μžˆλ‹€. 각 λ„μ‹œλŠ” M개의 λ„λ‘œλ‘œ μ—°κ²°λ˜μ–΄ 있으며, 각 λ„λ‘œλ₯Ό 지날 λ•Œ ν•„μš”ν•œ μ‹œκ°„μ΄ μ‘΄μž¬ν•œλ‹€. λ„λ‘œλŠ” 잘 μ—°κ²°λ˜μ–΄ 있기 λ•Œλ¬Έμ—, λ„μ‹œ Aμ—μ„œ B둜 이동할 수 μ—†λŠ” κ²½μš°λŠ” μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€.

λ„μ‹œ Aμ—μ„œ λ„μ‹œ B둜 λ°”λ‘œ 갈 수 μžˆλŠ” λ„λ‘œκ°€ μžˆκ±°λ‚˜, λ‹€λ₯Έ λ„μ‹œλ₯Ό κ±°μ³μ„œ 갈 수 μžˆμ„ λ•Œ, λ„μ‹œ Aμ—μ„œ Bλ₯Ό 갈 수 μžˆλ‹€κ³  ν•œλ‹€.

κ°•ν˜ΈλŠ” λͺ¨λ“  쌍의 λ„μ‹œμ— λŒ€ν•΄μ„œ μ΅œμ†Œ 이동 μ‹œκ°„μ„ κ΅¬ν•΄λ†“μ•˜λ‹€. λ―Όν˜ΈλŠ” 이 ν‘œλ₯Ό 보고 μ›λž˜ λ„λ‘œκ°€ λͺ‡ 개 μžˆλŠ”μ§€λ₯Ό ꡬ해보렀고 ν•œλ‹€.

예λ₯Ό λ“€μ–΄, 예제의 κ²½μš°μ— λͺ¨λ“  λ„μ‹œ 사이에 κ°•ν˜Έκ°€ κ΅¬ν•œ 값을 κ°€μ§€λŠ” λ„λ‘œκ°€ μ‘΄μž¬ν•œλ‹€κ³  해도 λœλ‹€. ν•˜μ§€λ§Œ, 이 λ„λ‘œμ˜ κ°œμˆ˜λŠ” μ΅œμ†Ÿκ°’μ΄ μ•„λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, λ„μ‹œ 1-2, 2-3, 1-4, 3-4, 4-5, 3-5λ₯Ό μ—°κ²°ν•˜λŠ” λ„λ‘œλ§Œ μžˆλ‹€κ³  가정해도, κ°•ν˜Έκ°€ κ΅¬ν•œ λͺ¨λ“  쌍의 μ΅œμ†Ÿκ°’μ„ ꡬ할 수 μžˆλ‹€. 이 경우 λ„λ‘œμ˜ κ°œμˆ˜λŠ” 6개이고, λͺ¨λ“  λ„λ‘œμ˜ μ‹œκ°„μ˜ 합은 55이닀.

λͺ¨λ“  쌍의 λ„μ‹œ μ‚¬μ΄μ˜ μ΅œμ†Œ 이동 μ‹œκ°„μ΄ μ£Όμ–΄μ‘Œμ„ λ•Œ, 이 λ‚˜λΌμ— μ‘΄μž¬ν•  수 μžˆλŠ” λ„λ‘œμ˜ 개수의 μ΅œμ†Ÿκ°’μΌ λ•Œ, λͺ¨λ“  λ„λ‘œμ˜ μ‹œκ°„μ˜ 합을 κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

 

μž…λ ₯

첫째 쀄에 λ„μ‹œμ˜ 개수 N(1 ≤ N ≤ 20)이 주어진닀. λ‘˜μ§Έ 쀄뢀터 N개의 쀄에 각각의 λ„μ‹œ 사이에 μ΄λ™ν•˜λŠ”λ° ν•„μš”ν•œ μ‹œκ°„μ΄ μ£Όμ–΄μ§„λ‹€. Aμ—μ„œ B둜 κ°€λŠ” μ‹œκ°„κ³Ό Bμ—μ„œ A둜 κ°€λŠ” μ‹œκ°„μ€ κ°™λ‹€. 또, A와 Bκ°€ 같은 κ²½μš°μ—λŠ” 0이 주어지고, κ·Έ μ™Έμ˜ κ²½μš°μ— ν•„μš”ν•œ μ‹œκ°„μ€ 2500보닀 μž‘κ±°λ‚˜ 같은 μžμ—°μˆ˜μ΄λ‹€.

 

좜λ ₯

첫째 쀄에 λ„λ‘œ κ°œμˆ˜κ°€ μ΅œμ†ŒμΌ λ•Œ, λͺ¨λ“  λ„λ‘œμ˜ μ‹œκ°„μ˜ 합을 좜λ ₯ν•œλ‹€. λΆˆκ°€λŠ₯ν•œ κ²½μš°μ—λŠ” -1을 좜λ ₯ν•œλ‹€.


μ–΄μ œ ν’€μ—ˆλ˜ ν”Œλ‘œμ΄λ“œ 와샬 μ•Œκ³ λ¦¬μ¦˜ 문제(11404번: ν”Œλ‘œμ΄λ“œ)λ₯Ό μ—­μœΌλ‘œ μƒκ°ν•˜λŠ” 문제.

 

μž…λ ₯으둜 주어진 값이 이미 ν”Œλ‘œμ΄λ“œ-와샬 μ•Œκ³ λ¦¬μ¦˜μ„ μ μš©ν•œ μƒνƒœλΌκ³  μƒκ°ν•˜κ³  μ ‘κ·Όν•˜λ©΄ λœλ‹€. λ°”λ‘œ 갈 수 μžˆλŠ” κ²½λ‘œκ°€ μžˆλŠ” 반면, λ‹€λ₯Έ λ„μ‹œλ₯Ό κ±°μ³μ„œ 갈 수 μžˆλŠ” 경둜 μ—­μ‹œ μ‘΄μž¬ν•˜κΈ° λ•Œλ¬Έμ— iμ—μ„œ j(λ˜λŠ” jμ—μ„œ i)κΉŒμ§€ μ΄λ™μ‹œκ°„ city[i][j]이 iμ—μ„œ k, kμ—μ„œ jκΉŒμ§€μ˜ μ΄λ™μ‹œκ°„μ˜ ν•©κ³Ό κ°™λ‹€λ©΄ μ΄λŠ” i ➑ k ➑ j둜 κ±°μ³μ„œ κ°€λŠ” κ²½λ‘œμ΄λ―€λ‘œ λ„λ‘œμ— ν¬ν•¨ν•˜μ§€ μ•ŠλŠ”λ‹€. 이λ₯Ό norouteλΌλŠ” bool 배열을 톡해 관리해쀀닀.

 

이 λ•Œ, 예제 μž…λ ₯ 4 처럼 i ➑ j둜의 μ΄λ™μ‹œκ°„μ΄ i ➑ k ➑ j보닀 클 κ²½μš°λŠ” λΆˆκ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έμ— -1을 좜λ ₯ν•΄μ€€λ‹€.

 

μ½”λ“œ
#include <cstdio>
#define MAX 21

int city[MAX][MAX];
bool noroute[MAX][MAX];

int main(void) {
    int N;
    scanf("%d", &N);

    for(int i = 0; i < N; i++) {
        for(int j = 0; j < N; j++) {
            scanf("%d", &city[i][j]);
        }
    }
    
    for(int k = 0; k < N; k++) {
        for(int i = 0; i < N; i++) {
            for(int j = 0; j < N; j++) {
                if(city[i][j] > city[i][k] + city[k][j]) {
                    printf("-1\n");
                    return 0;
                }
                if(i != k && j != k && city[i][k] + city[k][j] == city[i][j]) 
                    noroute[i][j] = true;
            }
        }
    }

    int count = 0;
    for(int i = 0; i < N; i++) {
        for(int j = 0; j < N; j++) {
            if(!noroute[i][j]) count += city[i][j];
        }
    }

    printf("%d\n", count / 2);
    return 0;
}
Comments