diff --git a/백준/Platinum/1948. 임계경로/README.md b/백준/Platinum/1948. 임계경로/README.md new file mode 100644 index 0000000..1561ae2 --- /dev/null +++ b/백준/Platinum/1948. 임계경로/README.md @@ -0,0 +1,38 @@ +# [Platinum V] 임계경로 - 1948 + +[문제 링크](https://www.acmicpc.net/problem/1948) + +### 성능 요약 + +메모리: 56040 KB, 시간: 240 ms + +### 분류 + +방향 비순환 그래프, 그래프 이론, 그래프 탐색, 위상 정렬 + +### 제출 일자 + +2025년 2월 28일 15:59:43 + +### 문제 설명 + +

월드 나라는 모든 도로가 일방통행인 도로이고, 싸이클이 없다. 그런데 어떤 무수히 많은 사람들이 월드 나라의 지도를 그리기 위해서, 어떤 시작 도시로부터 도착 도시까지 출발을 하여 가능한 모든 경로를 탐색한다고 한다.

+ +

이 지도를 그리는 사람들은 사이가 너무 좋아서 지도를 그리는 일을 다 마치고 도착 도시에서 모두 다 만나기로 하였다. 그렇다고 하였을 때 이들이 만나는 시간은 출발 도시로부터 출발한 후 최소 몇 시간 후에 만날 수 있는가? 즉, 마지막에 도착하는 사람까지 도착을 하는 시간을 의미한다.

+ +

어떤 사람은 이 시간에 만나기 위하여 1분도 쉬지 않고 달려야 한다. 이런 사람들이 지나는 도로의 수를 카운트 하여라.

+ +

출발 도시는 들어오는 도로가 0개이고, 도착 도시는 나가는 도로가 0개이다.

+ +### 입력 + +

첫째 줄에 도시의 개수 n(1 ≤ n ≤ 10,000)이 주어지고 둘째 줄에는 도로의 개수 m(1 ≤ m ≤ 100,000)이 주어진다. 그리고 셋째 줄부터 m+2줄까지 다음과 같은 도로의 정보가 주어진다. 처음에는 도로의 출발 도시의 번호가 주어지고 그 다음에는 도착 도시의 번호, 그리고 마지막에는 이 도로를 지나는데 걸리는 시간이 주어진다. 도로를 지나가는 시간은 10,000보다 작거나 같은 자연수이다.

+ +

그리고 m+3째 줄에는 지도를 그리는 사람들이 출발하는 출발 도시와 도착 도시가 주어진다.

+ +

모든 도시는 출발 도시로부터 도달이 가능하고, 모든 도시로부터 도착 도시에 도달이 가능하다.

+ +### 출력 + +

첫째 줄에는 이들이 만나는 시간을, 둘째 줄에는 1분도 쉬지 않고 달려야 하는 도로의 수가 몇 개인지 출력하여라.

+ diff --git a/백준/Platinum/1948. 임계경로/임계경로.py b/백준/Platinum/1948. 임계경로/임계경로.py new file mode 100644 index 0000000..49aa10a --- /dev/null +++ b/백준/Platinum/1948. 임계경로/임계경로.py @@ -0,0 +1,53 @@ +import sys +import math +from collections import deque + +input = sys.stdin.readline + +# 목표는 만나는 최소 시간과 최소시간에 모든 시간을 다 쓰는 사람의 지나는 도로의 수 카운트 + +n = int(input()) # 도시 수 +m = int(input()) # 도로 수 + +cityisdegree = [0] * (n+1) # 도시에 대한 진입차수 +maxtime = [0] * (n+1) #걸리는 최대 시간 +visitedcityroad = [0] * (n+1) # 방문하는 도시의 최대 수 (최대 시간 걸리는 사람이 방문하는 도시의 최대 수) +a = [[] for _ in range(n+1)] # 모든 이어진 도로 정보 +reverseA = [[] for _ in range(n+1)] # 모든 이어진 역방향 도로 정보 + +for i in range(m): + s, e, min = map(int, input().split()) # 출발 도시, 도착도시, 소요시간 + cityisdegree[e] += 1 + a[s].append((e, min)) + reverseA[e].append((s, min)) + +s_city, e_city = map(int, input().split()) # 시작 도시, 도착도시 + +queue = deque() +queue.append(s_city) + +while queue: + now = queue.popleft() + for e, min in a[now]: + maxtime[e] = max(maxtime[e], maxtime[now]+min) # 이 로직 맞는지 점검이 필요할듯? + cityisdegree[e] -= 1 + if (cityisdegree[e]==0): + queue.append(e) + +resultCount = 0 # 방문 최대횟수 +visited = [False] * (n+1) +queue.clear() +queue.append(e_city) + +while queue: + now = queue.popleft() + for s, min in reverseA[now]: + if(maxtime[now] == maxtime[s] + min): + resultCount+=1 + if not visited[s]: + visited[s] = True + queue.append(s) + + +print(maxtime[e_city]) +print(resultCount) \ No newline at end of file