본문 바로가기
알고리즘

백준_1507_궁금한 민호

by 매화of사군자 2020. 1. 28.

https://www.acmicpc.net/problem/1507

 

1507번: 궁금한 민호

첫째 줄에 도시의 개수 N(1 ≤ N ≤ 20)이 주어진다. 둘째 줄부터 N개의 줄에 각각의 도시 사이에 이동하는데 필요한 시간 (≤ 10,000)이 주어진다. A에서 B로 가는 시간과 B에서 A로 가는 시간은 같다. 또, A와 B가 같은 경우에는 필요한 시간은 0이다.

www.acmicpc.net

해결 방법

> 문제의 입력으로 각 도시마다의 '최소 걸리는 시간'이 2차원 배열로 주어진다.

> 2차원 배열로 주어지며, (i,i)의 값이 0이며 대각석을 기준으로 대칭인 것으로 보아 플로이드-워셜의 output 형태로 판단하였다.

> 플로이드 - 워셜을 역으로 돌리면서 불필요한 간선을 지운다.

 

코드

더보기

import sys, copy

 

input = sys.stdin.readline

 

num_city = int(input())

time_city = list()

 

for i in range(num_city):

    time_city.append(list(map(intinput().split())))

 

copy_time_city = copy.deepcopy(time_city)

 

def check(num_citytime_citycopy_time_city):

    for k in range(num_city):

        for i in range(num_city):

            for j in range(num_city):

                #대각선 처리

                if k == i or i == j or j == k:

                    continue

                #최단 경로가 주어져 있는데 그것보다 클 수는 없다

                if time_city[i][j] > time_city[i][k] + time_city[k][j]:

                    return print(-1)

                #도로 갯수 최소화

                if time_city[i][j] == time_city[i][k] + time_city[k][j]:

                    copy_time_city[i][j] = 0

    count = 0

    for i in copy_time_city:

        count += sum(i)

 

    return print(count//2)    

 

check(num_city, time_city, copy_time_city)

'알고리즘' 카테고리의 다른 글

백준_1068_트리  (0) 2020.01.30
백준_1068_트리(해결 못함)  (0) 2020.01.29
백준_5567_결혼식  (0) 2020.01.28
백준_1671_상어의 저녁식사  (0) 2020.01.26
백준_6086_최대 유량  (0) 2020.01.23

댓글