크래프톤 정글 TIL : 0919

lazyArtisan·2024년 9월 19일
0

정글 TIL

목록 보기
81/147

⚔️ 백준


📌 1948 임계경로

# 해당 도시까지 걸리는 최대 시간 경로 갱신
def max_time(city):
    course=set()
    if city==start:
        return 0
    if time[city]==-1: # 아직 탐색하지 않았다면
        for s,t in graph[city]:
            if time[city] < max_time(s)+t: # 최대 경로가 갱신됐다면
                time[city] = max_time(s)+t
    return time[city]

import sys
input = sys.stdin.readline
n=int(input()) # 도시의 개수
m=int(input()) # 도로의 개수
time=[-1]*(n+1) # 도시 도착 최대 시간
course=[set() for _ in range(n+1)]
graph=[[] for _ in range(n+1)] # 각 도시로 향하는 경로
# 도로 정보 받기
for _ in range(m):
    s,a,t = map(int,input().split())
    graph[a].append((s,t))
start,arrive=map(int,input().split())

result = max_time(arrive)
print(time[arrive])

일단 어제 봤던거 응용해서 시간 구하는 건 했음
이제 경로만 구하면 됨

# 해당 도시까지 걸리는 최대 시간 경로 갱신
def max_time(city):
    if city==start:
        course[start].add(start)
        return 0
    if time[city]==-1: # 아직 탐색하지 않았다면
        for s,t in graph[city]:
            bef_time = max_time(s)+t
            if time[city] < bef_time: # 최대 경로가 갱신됐다면
                time[city] = bef_time
                course[city] = course[s].copy()
            elif time[city] == bef_time: # 최대 경로를 더 발견했다면
                time[city] = bef_time
                course[city] = course[city] | course[s]
        course[city].add(city)
    return time[city]

import sys
input = sys.stdin.readline
n=int(input()) # 도시의 개수
m=int(input()) # 도로의 개수
time=[-1]*(n+1) # 도시 도착 최대 시간
course=[set() for _ in range(n+1)]
graph=[[] for _ in range(n+1)] # 각 도시로 향하는 경로
# 도로 정보 받기
for _ in range(m):
    s,a,t = map(int,input().split())
    graph[a].append((s,t))
start,arrive=map(int,input().split())

result = max_time(arrive)
print(time[arrive])
print(len(course[arrive]))

짤 없이 실패

디버깅 해보니까 깊은 복사를 안해줘서 그랬음

course[city] = course[s].copy()

??? 해줘도 틀렸습니다 뜬다

2
1
1 2 1
1 2
=> 1 1

이 테케 돌려봤더니 1 2 뜸
그제야 뭘 잘못 생각했는지 앎

저번에 풀 때도 이거 헷갈렸었음
노드가 아니라 달린 도로를 세야됨

import sys, copy
sys.setrecursionlimit(10**5)
# 해당 도시까지 걸리는 최대 시간 경로 갱신
def max_time(city):
    if city==start:
        return 0
    if time[city]==-1: # 아직 탐색하지 않았다면
        for s,t in graph[city]:
            bef_time = max_time(s)+t
            if time[city] < bef_time: # 최대 경로가 갱신됐다면
                time[city] = bef_time
                course[city] = course[s].copy()
                course[city].add((s,city))
            elif time[city] == bef_time: # 최대 경로를 더 발견했다면
                time[city] = bef_time
                course[city] = course[city] | course[s]
                course[city].add((s,city))
    return time[city]

import sys
input = sys.stdin.readline
n=int(input()) # 도시의 개수
m=int(input()) # 도로의 개수
time=[-1]*(n+1) # 도시 도착 최대 시간
course=[set() for _ in range(n+1)]
graph=[[] for _ in range(n+1)] # 각 도시로 향하는 경로
# 도로 정보 받기
for _ in range(m):
    s,a,t = map(int,input().split())
    graph[a].append((s,t))
start,arrive=map(int,input().split())

result = max_time(arrive)
print(time[arrive])
print(len(course[arrive]))

ㅋㅋㅋㅋ 바꾸니까 퍼센트 올라가는데 또 그때처럼 메모리 초과 뜸

돌겠네

https://t-anb.tistory.com/35

어쩔 수 없이 답지들을 봤다.
각 경로에 모든 이전 경로들을 저장하는게 아니라,
각 노드에서 역추적해야할 도로 1단계씩만 저장하면 됐던 거였다.
굳이 다 할 필요 없음. 그 다음엔 역추적 하면 됨...

import sys
sys.setrecursionlimit(10**5)
# 해당 도시까지 걸리는 최대 시간 경로 갱신
def max_time(city):
    if city==start:
        return 0
    if time[city]==-1: # 아직 탐색하지 않았다면
        for s,t in graph[city]:
            bef_time = max_time(s)+t
            if time[city] < bef_time: # 최대 경로가 갱신됐다면
                time[city] = bef_time
                course[city] = [s]
            elif time[city] == bef_time: # 최대 경로를 더 발견했다면
                time[city] = bef_time
                course[city].append(s)
    return time[city]

import sys
input = sys.stdin.readline
n=int(input()) # 도시의 개수
m=int(input()) # 도로의 개수
time=[-1]*(n+1) # 도시 도착 최대 시간
course=[[] for _ in range(n+1)]
graph=[[] for _ in range(n+1)] # 각 도시로 향하는 경로
# 도로 정보 받기
for _ in range(m):
    s,a,t = map(int,input().split())
    graph[a].append((s,t))
start,arrive=map(int,input().split())

print(max_time(arrive))
from collections import deque
result=set()
q=deque()
q.append(arrive)
while q:
    city=q.popleft()
    for bef in course[city]:
        if (bef,city) not in result:
            result.add((bef,city))
            q.append(bef)
print(len(result))

어후 겨우 맞았습니다 봤네
이건 답지를 좀 참고했으니 나중에 다시 풀어야 될듯

역추적에 대한 아이디어를 얻어가자

탐색 자체는 역추적 안해도 되고 임계경로로 풀면 됐는듯

0개의 댓글