Skip to content

Commit ee860fd

Browse files
authored
찬민 백준 숙제 (#69)
1 parent f601da9 commit ee860fd

File tree

2 files changed

+130
-0
lines changed

2 files changed

+130
-0
lines changed

cmkim/BaekJoon/백준_14938.py

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
# 각 지역에서 시작했을때 다른 지역까지의 거리를 모두 구할수 있어야한다 dijkstra를 통해서
2+
# 그 이후 r보다 작은 값들에 있는 지역의 아이템 갯수를 모두 구해서 더하기
3+
4+
5+
# 위의 과정들을 모든 시작점에 대해 반복해줘서 가장 큰 값 찾아서 출력하기
6+
import sys, heapq
7+
8+
9+
def dijkstra(start):
10+
sum = 0
11+
q = []
12+
distance = [INF] * (n + 1)
13+
distance[start] = 0
14+
15+
heapq.heappush(q, [0, start]) #q에다 start 에서 자기 자신으로 가는 초기값 넣기
16+
17+
while q:
18+
cur_distance, cur = heapq.heappop(q) # q에서 현재지점 current 까지의 distance 정보 가져오기
19+
20+
for i in range(n+1):
21+
if 0 < d[cur][i] < INF:
22+
if d[cur][i] + cur_distance < distance[i]:
23+
distance[i] = d[cur][i] + cur_distance
24+
heapq.heappush(q, [distance[i], i])
25+
26+
for i in range(1, n+1):
27+
if distance[i] <= m:
28+
sum += area_item[i]
29+
30+
return sum
31+
32+
n, m, r = map(int, input().split())
33+
INF = 1000000000
34+
#area = [0]*(n+1)
35+
d = [[INF] * (n+1) for _ in range(n+1)]
36+
for i in range(n):
37+
d[i+1][i+1] = 0
38+
result = 0 #최종적으로 출력할 정답
39+
40+
# 지역 마다의 자원의 갯수 입력받기
41+
area_item = list(map(int, input().split()))
42+
area_item.insert(0, 0)
43+
#print(area_item)
44+
45+
# 지역별 이동거리를 인접 행렬로 입력 받기
46+
for i in range(r):
47+
start, end, distance = map(int, input().split())
48+
#d[i+1][i+1] = 0
49+
d[start][end] = distance
50+
d[end][start] = distance
51+
52+
#print(d)
53+
54+
for i in range(n):
55+
if dijkstra(i+1) > result:
56+
result = dijkstra(i+1)
57+
58+
print(result)
59+
60+
61+
62+
63+
64+
65+

cmkim/BaekJoon/백준_16118.py

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
import sys, heapq
2+
3+
n, m = map(int, input().split())
4+
INF = 1000000000
5+
d = [[INF]*(n+1) for _ in range(n+1)]
6+
result = 0
7+
8+
for i in range(m):
9+
a, b, dist = map(int, input().split())
10+
d[a][b] = dist
11+
d[b][a] = dist
12+
13+
for i in range(n):
14+
d[i+1][i+1] = 0
15+
16+
def dijkstra1(start, dest): # 달빛여우
17+
q = []
18+
distance = [INF] * (n+1)
19+
distance[start] = 0
20+
heapq.heappush(q, [0, start])
21+
22+
while(q):
23+
cur_distance, cur = heapq.heappop(q)
24+
25+
for i in range(1, n+1):
26+
if 0 < d[cur][i] < INF:
27+
if d[cur][i] + cur_distance < distance[i]:
28+
distance[i] = d[cur][i] + cur_distance
29+
heapq.heappush(q, [distance[i], i])
30+
31+
return distance[dest]
32+
33+
def dijkstra2(start, dest): #달빛늑대
34+
q = []
35+
distance = [[INF] * (n + 1) for _ in range(2)] # distance[0] 빠른도착 , distance[1] 느린 도착
36+
distance[start][start] = 0
37+
heapq.heappush(q, [0, start, 1]) # 3번째 인자를 추가, 1 = 두배의 속력, -1 = 절반의 속력
38+
result_distance = [INF] * (n+1)
39+
40+
while(q):
41+
cur_distance, cur, condition = heapq.heappop(q)
42+
43+
for i in range(1, n+1):
44+
if 0 < d[cur][i] < INF:
45+
if condition == 1:
46+
if (d[cur][i]/2) + cur_distance < distance[0][i]:
47+
distance[0][i] = (d[cur][i] / 2) + cur_distance
48+
heapq.heappush(q, [distance[0][i], i, -1])
49+
50+
elif condition == -1:
51+
if (d[cur][i] * 2) + cur_distance < distance[1][i]:
52+
distance[1][i] = (d[cur][i] * 2) + cur_distance
53+
heapq.heappush(q, [distance[1][i], i, 1])
54+
55+
for i in range(1, n+1):
56+
result_distance[i] = min(distance[0][i], distance[1][i])
57+
58+
return result_distance[dest]
59+
60+
61+
for i in range(2, n+1):
62+
if dijkstra1(1, i) < dijkstra2(1, i):
63+
result += 1
64+
65+
print(result)

0 commit comments

Comments
 (0)