Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- fibo
- 바텀업
- XML주석
- 오픽가격
- 영어회화
- dynamicProgramming
- opic
- 메모이제이션
- 안드로이드
- 영어말하기
- 주석
- 다이나믹프로그래밍
- ㅂ
- stack 스택
- 디피
- 오픽노잼공부방법
- dp
- 이진탐색 #나무 자르기
- 오픽노잼
- 피보나치수열
- 이진탐색
- topdown
- 오픽공부법
- English
- 안드로이드주석
- XML
- 탑다운
- 오픽점수잘받는방법
- 오픽
Archives
RUBY
[백준] 임계경로 본문
출처:: www.acmicpc.net/problem/1948
분류:: 위상정렬
1. 문제 이해 및 해결과정
- 어떤 사람은 이 시간에 만나기 위하여 1분도 쉬지 않고 달려야 한다.=> 임계경로 - 임계경로는 전체 중에서 여러 경로가 동시에 이루어질 때, 가장 오래 걸리는 경로를 의미한다. - 가장 오래 걸리는 경로를 구하고 백트래킹을 할 때 중복된 도로를 제거해주어야한다 1->2 2->6 6->7 // 1->4 4->6 6->7 의 두가지 경우가 존재한다. 6->7은 중복된 도로이므로 한 번만 카운트 해주어야 한다 |
2. 풀이방법
1. python
#임계경로
#https://www.acmicpc.net/problem/1948
import sys
from collections import deque
sys.stdin = open("input.txt","r")
n=int(input()) #노드, 도시 개수
m=int(input()) #도로의 개수
graph=[[]*(n+1) for _ in range(n+1)]
back_graph=[[]*(n+1) for _ in range(n+1)]
indegree=[0]*(n+1) #진입차수
result=[0]*(n+1)
check=[0]*(n+1)
q=deque()
for _ in range(m):
a,b,t=map(int,input().split())
graph[a].append((b,t))
back_graph[b].append((a,t))
indegree[b]+=1
start,end=map(int,input().split())
q.append(start)
def topologysort():
while q:
cur=q.popleft()
for i,t in graph[cur]:
indegree[i]-=1
result[i]=max(result[i],result[cur]+t)
if indegree[i]==0:
q.append(i)
#백트래킹
cnt=0 #임계경로에 속한 모든 정점의 개수
q.append(end)
while q: #도착점에서 시작점으로
cur=q.popleft()
for i,t in back_graph[cur]:
#도착점까지의 비용에서 시작점의 비용을 뺐을 때 그 간선비용과 같다면
if result[cur]-result[i]==t:
cnt+=1
if check[i]==0: #큐에 한번씩만 담을 수 있도록,중복방문제거
q.append(i)
check[i]=1
print(result[end])
print(cnt)
topologysort()
3. 오답원인
4. 알게된 점
'PS > BOJ' 카테고리의 다른 글
[백준] 용액 (0) | 2020.09.16 |
---|---|
[백준] 입국심사 (0) | 2020.09.16 |
[백준] 용액 합성하기 (0) | 2020.09.16 |
[백준] 집합의 표현 (0) | 2020.09.16 |
[백준] 예산 (0) | 2020.09.15 |
Comments