[11404번] 가장 빠른 버스 노선 구하기(그래프, 최단거리 , 플로이드)

2023. 3. 21. 18:11·Coding Test/Graph
목차
  1. 플로이드-워셜
  2. 원리
  3. 풀이
728x90
 

11404번: 플로이드

첫째 줄에 도시의 개수 n이 주어지고 둘째 줄에는 버스의 개수 m이 주어진다. 그리고 셋째 줄부터 m+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그 버스의 출발 도시의 번호가

www.acmicpc.net

 

플로이드-워셜

  • 시작점 X
  • 모든 노드간에 최단 경로 탐색
  • 시간복잡도 O(V³) 안좋음 ➡️ 노드의 개수 100~200까지 사용 가능
  • 문제 유형
    • 시작점이 없고 모든 도시간의 최단거리, 모든 도시 100개 이하
    • 점화식 D[S][E] = Math.min(D[S][E], D[S][K] + D[K][E])

 

원리

  1. 리스트를 선언하고 초기화하기
  2. 최단 거리 리스트에 그래프 데이터 저장하기
  3. 점화식으로 리스트 업데이트하기
더보기
  • [Step 1] 1번 노드를 거쳐 가는 경우를 고려하여 테이블을 갱신한다
  • [Step 2] 2번 노드를 거쳐 가는 경우를 고려하여 테이블을 갱신한다
  • [Step 3] 3번 노드를 거쳐 가는 경우를 고려하여 테이블을 갱신한다
  • [Step 4] 4번 노드를 거쳐 가는 경우를 고려하여 테이블을 갱신한다

풀이

"""
n개의 도시(2~100)
m 버스의 개수(1~100,000)
모든 도시의 쌍에 관해 가는 데 필요한 비용의 최솟값


a(시작도시) b(도착도시) c(비용 1~100,000)
시작도시와 도착 도시를 연결하는 노선은 1개가 아닐 수 있다

n개의 줄 출력
"""
import sys

# 도시 개수
n = int(input())

# 버스 개수
m = int(input())

# 인접행렬
d = array = [[sys.maxsize for j in range(n+1)] for i in range(n+1)]

# 인접 행렬에 시작 도시와 종료 도시가 같은 자리에 0 저장
for i in range(1, n+1):
    d[i][i] = 0

# 노선 데이터 입력받아 d행렬에 저장
for i in range(m):
    a, b, c = map(int, input().split())
    if d[a][b] > c:
        d[a][b] = c


"""
플로이드 워셜 알고리즘 로직
for 경유지 k에 관해 (1~n)
	for 출발노드 s에 관해 (1~n)
   		for 도착 노드 e에 관해(1~n)
            점화식 d[s][e] = Math.min(d[s][e], d[s][k]+d[k][e])
"""
for k in range(1, n+1):
    for s in range(1, n+1):
        for e in range(1, n+1):
            if d[s][e] > d[s][k] + d[k][e]:
                d[s][e] = d[s][k] + d[k][e]

 
# 출력
for i in range(1, n+1):
    for j in range(1, n + 1):
        if d[i][j] != sys.maxsize:
            print(d[i][j], end=" ")
        else:
            print(0, end=" ")
    print()

 

 

 

 

728x90
  1. 플로이드-워셜
  2. 원리
  3. 풀이
'Coding Test/Graph' 카테고리의 다른 글
  • 그래프의 표현 및 비교 (간선 리스트, 인접 행렬, 인접 리스트)
  • [1197번] 최소 신장 트리(MST, 크루스칼, 프림, 유니온파인드)
  • 그래프 최단거리 알고리즘 정리 및 비교 (다익스트라, 벨만-포드, 플로이드-워셜)
  • [11657번] 타임머신 (그래프, 최단거리, 벨만 포드 알고리즘)
Karla Ko
Karla Ko
𝘾𝙤𝙣𝙩𝙞𝙣𝙪𝙤𝙪𝙨𝙡𝙮 𝙄𝙢𝙥𝙧𝙤𝙫𝙞𝙣𝙜, 𝘾𝙤𝙣𝙨𝙩𝙖𝙣𝙩𝙡𝙮 𝘿𝙚𝙫𝙚𝙡𝙤𝙥𝙞𝙣𝙜 𝙔𝙚𝙨!
    250x250
  • Karla Ko
    karlaLog
    Karla Ko
  • 전체
    오늘
    어제
    • Total (467)
      • Spring (19)
      • JPA (4)
      • Cloud & Architecture (15)
        • Kubernetes (5)
        • Docker (3)
        • MSA (2)
        • GCP (1)
        • AWS (4)
      • Devops (1)
      • Message Queue (4)
        • Kafka (2)
        • RabbitMQ (2)
      • Git (4)
      • DB (4)
      • Java (9)
      • Python (4)
      • CS (11)
        • OS (8)
        • Network (2)
        • Algorithm (1)
      • Coding Test (392)
        • programmers (156)
        • Graph (43)
        • DP (37)
        • Search (31)
        • Tree (13)
        • Data Structure (26)
        • Combination (12)
        • Implement (18)
        • Geedy (23)
        • Sort (7)
        • Math (21)
        • geometry (2)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    이분탐색
    최단거리
    백준
    구간합
    스택
    DP
    구현
    재귀
    그래프
    큐
    힙
    트리
    조합
    Algorithm
    프로그래머스
    덱
    LIS
    최대공약수
    알고리즘
    파이썬
    최소신장트리
    자료구조
    그리디
    BFS
    다익스트라
    정렬
    동적계획법
    월간코드챌린지
    DFS
    플로이드워셜
  • hELLO· Designed By정상우.v4.10.3
Karla Ko
[11404번] 가장 빠른 버스 노선 구하기(그래프, 최단거리 , 플로이드)
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.