Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
65 changes: 65 additions & 0 deletions cmkim/BaekJoon/백준_14938.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
# 각 지역에서 시작했을때 다른 지역까지의 거리를 모두 구할수 있어야한다 dijkstra를 통해서
# 그 이후 r보다 작은 값들에 있는 지역의 아이템 갯수를 모두 구해서 더하기


# 위의 과정들을 모든 시작점에 대해 반복해줘서 가장 큰 값 찾아서 출력하기
import sys, heapq


def dijkstra(start):
sum = 0
q = []
distance = [INF] * (n + 1)
distance[start] = 0

heapq.heappush(q, [0, start]) #q에다 start 에서 자기 자신으로 가는 초기값 넣기

while q:
cur_distance, cur = heapq.heappop(q) # q에서 현재지점 current 까지의 distance 정보 가져오기

for i in range(n+1):
if 0 < d[cur][i] < INF:
if d[cur][i] + cur_distance < distance[i]:
distance[i] = d[cur][i] + cur_distance
heapq.heappush(q, [distance[i], i])

for i in range(1, n+1):
if distance[i] <= m:
sum += area_item[i]

return sum

n, m, r = map(int, input().split())
INF = 1000000000
#area = [0]*(n+1)
d = [[INF] * (n+1) for _ in range(n+1)]
for i in range(n):
d[i+1][i+1] = 0
result = 0 #최종적으로 출력할 정답

# 지역 마다의 자원의 갯수 입력받기
area_item = list(map(int, input().split()))
area_item.insert(0, 0)
#print(area_item)

# 지역별 이동거리를 인접 행렬로 입력 받기
for i in range(r):
start, end, distance = map(int, input().split())
#d[i+1][i+1] = 0
d[start][end] = distance
d[end][start] = distance

#print(d)

for i in range(n):
if dijkstra(i+1) > result:
result = dijkstra(i+1)

print(result)







65 changes: 65 additions & 0 deletions cmkim/BaekJoon/백준_16118.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
import sys, heapq

n, m = map(int, input().split())
INF = 1000000000
d = [[INF]*(n+1) for _ in range(n+1)]
result = 0

for i in range(m):
a, b, dist = map(int, input().split())
d[a][b] = dist
d[b][a] = dist

for i in range(n):
d[i+1][i+1] = 0

def dijkstra1(start, dest): # 달빛여우
q = []
distance = [INF] * (n+1)
distance[start] = 0
heapq.heappush(q, [0, start])

while(q):
cur_distance, cur = heapq.heappop(q)

for i in range(1, n+1):
if 0 < d[cur][i] < INF:
if d[cur][i] + cur_distance < distance[i]:
distance[i] = d[cur][i] + cur_distance
heapq.heappush(q, [distance[i], i])

return distance[dest]

def dijkstra2(start, dest): #달빛늑대
q = []
distance = [[INF] * (n + 1) for _ in range(2)] # distance[0] 빠른도착 , distance[1] 느린 도착
distance[start][start] = 0
heapq.heappush(q, [0, start, 1]) # 3번째 인자를 추가, 1 = 두배의 속력, -1 = 절반의 속력
result_distance = [INF] * (n+1)

while(q):
cur_distance, cur, condition = heapq.heappop(q)

for i in range(1, n+1):
if 0 < d[cur][i] < INF:
if condition == 1:
if (d[cur][i]/2) + cur_distance < distance[0][i]:
distance[0][i] = (d[cur][i] / 2) + cur_distance
heapq.heappush(q, [distance[0][i], i, -1])

elif condition == -1:
if (d[cur][i] * 2) + cur_distance < distance[1][i]:
distance[1][i] = (d[cur][i] * 2) + cur_distance
heapq.heappush(q, [distance[1][i], i, 1])

for i in range(1, n+1):
result_distance[i] = min(distance[0][i], distance[1][i])

return result_distance[dest]


for i in range(2, n+1):
if dijkstra1(1, i) < dijkstra2(1, i):
result += 1

print(result)