๐ฃ๐ฟ๐ผ๐ด๐ฟ๐ฎ๐บ๐บ๐ถ๐ป๐ด๐ป/[๐๐ฒ๐ญ๐ก๐จ๐ง] ๐๐ฅ๐ ๐จ๐ซ๐ข๐ญ๐ก๐ฆ
[Python] ๋ฐฑ์ค 11004 & ๋ฐฑ์ค 10282
๐คRyusun๐ค
2023. 6. 9. 18:33
# ๋ฐฑ์ค 11004๋ฒ
# ์ N๊ฐ A1, A2, ... A_N์ด ์ฃผ์ด์ง๋ค. A๋ฅผ ์ค๋ฆ์ฐจ์ ์ ๋ ฌํ์ ๋, ์์์๋ถํฐ k๋ฒ์งธ ์๋ ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค
# ์ถ๋ ฅ
# A๋ฅผ ์ ๋ ฌํ์ ๋, ์์์๋ถํฐ k๋ฒ์งธ ์๋ ์๋ฅผ ์ถ๋ ฅํ๋ค.
# ๋ฌธ์ ํ์ด ํต์ฌ ์์ด๋์ด
# ๋ฐ์ดํฐ์ ๊ฐ์๊ฐ ์ต๋ 5000000๊ฐ ์ด๋ฏ๋ก ์๊ฐ ๋ณต์ก๋ O(NlogN)์ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํด์ผํ๋ค.
# ๊ณ ๊ธ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ(๋ณํฉ ์ ๋ ฌ, ํต ์ ๋ ฌ, ํ ์ ๋ ฌ ๋ฑ)์ ์ด์ฉํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐ๊ฐ๋ฅ
def merge_sort(data):
if len(data) <= 1:
return data
medium = int(len(data)) // 2
left = merge_sort(data[:medium])
right = merge_sort(data[medium:])
merged = []
left_point, right_point = 0, 0
while len(left) > left_point and len(right) > right_point:
if left[left_point] < right[right_point]:
left.append(left[left_point])
left_point += 1
else:
right.append(right[right_point])
right_point += 1
while len(left) > left_point:
merged.append(left[left_point])
left_point += 1
while len(right) > right_point:
merged.append(right[right_point])
right_point += 1
return merged
n, k = map(int, input().split(' '))
data = list(map(int, input().split(' ')))
merged = merge_sort(data)
print(merged[k - 1])# k๋ฒ์งธ ์์๋ฅผ ์ถ๋ ฅํด์ผ ํ๊ธฐ๋๋ฌธ์ k-1์ ์
๋ ฅ
#ํดํน 10282
import sys
import heapq
def dijkstra(graph, min_dist, start_node):
queue = []
heapq.heappush(queue, [0, start_node])
min_dist[start_node] = 0
while queue:
dist, current = heapq.heappop(queue)
if min_dist[current] < dist :
continue
for next, sec in graph[current]:
cost = min_dist[current] + sec
if cost < min_dist[next]:
min_dist[next] = cost
heapq.heappush(queue, [cost, next])
return min_dist
t= int(input())
for _ in range(t):
n, d, c = map(int, sys.stdin.readline().split())
graph = [[] for _ in range(n+1)]
min_dist = [1e9] * (n+1)
for _ in range(d):
a, b, s = map(int, sys.stdin.readline().split())
graph[b].append([a,s])
min_dist= dijkstra(graph, min_dist, c)
answer = 0
cnt = 0
for i in min_dist:
if i != 1e9:
cnt += 1
answer = max(answer, i)
print(cnt, answer)