-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathC
More file actions
52 lines (45 loc) · 1.38 KB
/
C
File metadata and controls
52 lines (45 loc) · 1.38 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
from heapq import *
def dey(G, a):
"""дейкстра с кучей"""
distances = [float('+inf')] * len(G)
distances[a] = 0
Q = [(0, a)]
used = set()
while Q:
curr_d, curr = heappop(Q)
if curr_d != distances[curr]:
continue
for neibor in G[curr]:
if neibor not in used:
new_dist = distances[curr] + G[curr][neibor]
if new_dist < distances[neibor]:
distances[neibor] = new_dist
heappush(Q, (new_dist, neibor))
used.add(curr)
return distances
# reading
input_data = [int(x) for x in input().split()]
n = input_data[0] # количество вершин
m = input_data[1] # рёбер
main_cities = input_data[2:]
G = {x: {} for x in range(n)}
for main_city in range(m):
a, b, w = [int(x) for x in input().split()]
G[a][b] = w
G[b][a] = w
# finding
distances = {main_city:[] for main_city in main_cities}
for main_city in main_cities:
distances[main_city] = dey(G, main_city)
for city in range(n):
# ищем ближайший
if city in main_cities:
print(city)
else:
min_d = float("+inf")
center = -1
for main_city in main_cities:
if distances[main_city][city] < min_d:
min_d = distances[main_city][city]
center = main_city
print(center)