From 11fe71a2b8334804e19b6ee43eec0563932c498c Mon Sep 17 00:00:00 2001 From: bsyzch Date: Mon, 3 May 2021 00:55:18 +0900 Subject: [PATCH] =?UTF-8?q?=EC=B0=AC=EB=AF=BC=20=EB=B0=B1=EC=A4=80=20?= =?UTF-8?q?=EC=88=99=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../\353\260\261\354\244\200_14938.py" | 65 +++++++++++++++++++ .../\353\260\261\354\244\200_16118.py" | 65 +++++++++++++++++++ 2 files changed, 130 insertions(+) create mode 100644 "cmkim/BaekJoon/\353\260\261\354\244\200_14938.py" create mode 100644 "cmkim/BaekJoon/\353\260\261\354\244\200_16118.py" diff --git "a/cmkim/BaekJoon/\353\260\261\354\244\200_14938.py" "b/cmkim/BaekJoon/\353\260\261\354\244\200_14938.py" new file mode 100644 index 0000000..64f31ac --- /dev/null +++ "b/cmkim/BaekJoon/\353\260\261\354\244\200_14938.py" @@ -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) + + + + + + + diff --git "a/cmkim/BaekJoon/\353\260\261\354\244\200_16118.py" "b/cmkim/BaekJoon/\353\260\261\354\244\200_16118.py" new file mode 100644 index 0000000..14d7cce --- /dev/null +++ "b/cmkim/BaekJoon/\353\260\261\354\244\200_16118.py" @@ -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)