[백준] 9370 - 미확인 도착지 (G2)

2023. 10. 2. 02:05·알고리즘 (PS)/BOJ
반응형

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

 

9370번: 미확인 도착지

(취익)B100 요원, 요란한 옷차림을 한 서커스 예술가 한 쌍이 한 도시의 거리들을 이동하고 있다. 너의 임무는 그들이 어디로 가고 있는지 알아내는 것이다. 우리가 알아낸 것은 그들이 s지점에서

www.acmicpc.net

한 노드에 대한 최단 경로에 특정 경로가 포함되어 있는지를 확인하는 문제이다.

 

아이디어는 어렵지 않은데, 구현이 복잡하다.

 

나는 처음에 다익스트라를 한번 돌리면서, 그 과정에 <g, h> 간선이 포함되는지를 체크하려고 하였다.

그런데 최단경로가 여러개인 경우, <g, h> 간선이 포함된 최단 경로를 먼저 고르는 것을 구현하기가 어려워서 이 방법은 포기했다. (나중에 난이도 기여 내역을 보니 이렇게 푼 사람도 있었다.)

 

그 다음 떠올린 간단한 방법은 다익스트라를 3번 돌리는 것이다.

s 부터 출발하는 다익스트라, g 부터 출발하는 다익스트라, h 부터 출발하는 다익스트라

 

이렇게 3개를 돌린 결과를 모두 저장한 뒤, 체크할 노드가 check 라고 하면

s -> check == s -> g + g -> h + h -> check

s -> check == s -> h + h -> g + g -> check

이렇게 2가지를 체크해서 둘 중 하나라도 해당되면 답으로 체크해주면 된다.

 

import sys
from heapq import heappush, heappop
input = sys.stdin.readline
INF = 9876543210

T = int(input())
for _ in range(T):
    n, m, t = map(int, input().split())
    s, g, h = map(int, input().split())
    graph = [[] for _ in range(n+1)]
    check_dist = 0

    dist_for_h = [INF for _ in range(n + 1)]
    for _ in range(m):
        a, b, d = map(int, input().split())
        graph[a].append((b, d))
        graph[b].append((a, d))
        if (a == g and b == h) or (a == h and b == g):
            check_dist = d

    # get dist for s
    pq = []
    dist_for_s = [INF for _ in range(n + 1)]
    dist_for_s[s] = 0
    heappush(pq, (0, s))
    visit = [False for _ in range(n + 1)]
    while pq:
        d, node = heappop(pq)

        if visit[node]:
            continue

        for next_node, next_dist in graph[node]:
            if not visit[next_node]:
                if dist_for_s[next_node] >= dist_for_s[node] + next_dist:
                    dist_for_s[next_node] = dist_for_s[node] + next_dist
                    heappush(pq, (dist_for_s[next_node], next_node))

        visit[node] = True

    # get dist for g
    pq = []
    visit = [False for _ in range(n+1)]
    dist_for_g = [INF for _ in range(n + 1)]
    dist_for_g[g] = 0
    heappush(pq, (0, g))
    while pq:
        d, node = heappop(pq)

        if visit[node]:
            continue

        for next_node, next_dist in graph[node]:
            if not visit[next_node]:
                if dist_for_g[next_node] >= dist_for_g[node] + next_dist:
                    dist_for_g[next_node] = dist_for_g[node] + next_dist
                    heappush(pq, (dist_for_g[next_node], next_node))

        visit[node] = True

    # get dist for h
    pq = []
    visit = [False for _ in range(n + 1)]
    dist_for_h = [INF for _ in range(n + 1)]
    dist_for_h[h] = 0
    heappush(pq, (0, h))
    while pq:
        d, node = heappop(pq)

        if visit[node]:
            continue

        for next_node, next_dist in graph[node]:
            if not visit[next_node]:
                if dist_for_h[next_node] >= dist_for_h[node] + next_dist:
                    dist_for_h[next_node] = dist_for_h[node] + next_dist
                    heappush(pq, (dist_for_h[next_node], next_node))

        visit[node] = True

    check = []
    for _ in range(t):
        check.append(int(input()))
    check.sort()

    ans = []
    for node in check:
        if dist_for_s[node] == dist_for_s[g] + check_dist + dist_for_h[node]:
            ans.append(node)
        elif dist_for_s[node] == dist_for_s[h] + check_dist + dist_for_g[node]:
            ans.append(node)

    print(*ans)

똑같은 다익스트라를 3번 적어서 코드는 길지만 내용은 어렵지 않다.

반응형
저작자표시 비영리 변경금지 (새창열림)

'알고리즘 (PS) > BOJ' 카테고리의 다른 글

[백준] 30105 - 아즈버의 이빨 자국 (G5)  (0) 2023.10.31
[백준] 2629 - 양팔저울 (G3)  (0) 2023.10.28
[백준] 28458 - Mahjong Tenpai (P5)  (0) 2023.08.27
[백준] 28457 - Every? Only One's Marble (G1)  (0) 2023.08.27
[백준] 3015 - 오아시스 재결합 (P5)  (0) 2023.07.04
'알고리즘 (PS)/BOJ' 카테고리의 다른 글
  • [백준] 30105 - 아즈버의 이빨 자국 (G5)
  • [백준] 2629 - 양팔저울 (G3)
  • [백준] 28458 - Mahjong Tenpai (P5)
  • [백준] 28457 - Every? Only One's Marble (G1)
에버듀
에버듀
개발은 좋은데 뭘로 개발할까
  • 에버듀
    Blog. 에버듀
    에버듀
  • 전체
    오늘
    어제
    • 분류 전체보기 (614)
      • 개인 프로젝트 (43)
        • 토이 프로젝트 (3)
        • [2020] 카카오톡 봇 (9)
        • [2021] 코드악보 공유APP (22)
        • [2022] 유튜브 뮤직 클론코딩 (9)
        • [2025] 한글 SQL 데이터베이스 (0)
      • 팀 프로젝트 (22)
        • [2020] 인공지능 숫자야구 (4)
        • [2022] OSAM 온라인 해커톤 (10)
        • [2024] GDSC 프로젝트 트랙 (6)
        • [2025] 큰소리 웹 페이지 (2)
      • CS (335)
        • 자료구조 (19)
        • 어셈블리 (41)
        • 멀티미디어응용수학 (7)
        • 컴퓨터 구조 (29)
        • 알고리즘 분석 (4)
        • 컴퓨터 네트워크 (38)
        • 프로그래밍언어론 (15)
        • HCI 윈도우즈프로그래밍 (26)
        • 기초데이터베이스 (29)
        • 운영체제 (23)
        • 오토마타 (24)
        • 문제해결기법 (11)
        • 블록체인 (22)
        • 소프트웨어공학 (21)
        • 기계학습심화 (12)
        • 컴퓨터그래픽스와 메타버스 (8)
        • 분산시스템특론 (6)
      • 자기계발 (44)
        • 생각 정리 (22)
        • 대외활동 (11)
        • 동아리 (7)
        • 자격증 (3)
        • 머니 스터디 (1)
      • 알고리즘 (PS) (107)
        • BOJ (101)
        • Programmers (5)
        • 알고리즘 이모저모 (1)
      • WEB(BE) (8)
        • express.js (1)
        • Spring & Spring Boot (7)
      • WEB(FE) (2)
        • html, css, js (1)
        • React.js (1)
      • Tool & Language (6)
        • Edit Plus (1)
        • Git (1)
        • Python3 (2)
        • Java (2)
      • Infra (12)
        • AWS (1)
        • Oracle Cloud (8)
        • Firebase (2)
        • Network (1)
      • Android (18)
        • Java (6)
        • Flutter (12)
      • Window (2)
        • Visual Studio 없이 WPF (1)
        • MFC (1)
      • 독서 (14)
        • Inside Javascript (7)
        • Database Internals (6)
        • 한 글 후기 (1)
  • 링크

    • github
    • website
  • 인기 글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
에버듀
[백준] 9370 - 미확인 도착지 (G2)
상단으로

티스토리툴바