Pagini recente » Cod sursa (job #965958) | Cod sursa (job #177565) | Cod sursa (job #736114) | Cod sursa (job #965936) | Cod sursa (job #2929849)
from math import dist
#Complexitate: (O (k * (n + m)), unde k este numarul de puncte de control, n numarul de noduri si m numarul de muchii)
graph = [[] for _ in range (100001)] #lista de adiacenta a grafului
distance = [-1 for _ in range (100001)] #distanta minima de la un punct de control pana la un nod
#bfs-ul ne arata distanta minima de la un nod la celelalte deoarece graful este neponderat
def bfs(start_node: int):
queue = [] #coada pentru bfs
visited = [False for _ in range (100001)] #nodurile pe care le-am vizitat in bfs
queue.append(start_node) #adaugam nodul de la care incepem dfs-ul in coada
while len(queue) != 0: #cat timp coada nu este goala mai avem noduri care trebuiesc parcurse
current_node = queue.pop(0)
visited[current_node] = True #marcam nodul curent ca si cum ar fi vizitat
for vecin in graph[current_node]:
if distance[vecin] == -1: #prima data cand gasim o distanta de la un punct de control pana la un nod
distance[vecin] = distance[current_node] + 1
else:
distance[vecin] = min (distance[vecin], distance[current_node] + 1) #daca am gasit o distanta mai buna o punem pe aceea
if visited[vecin] == False: #vizitam nodurile care nu au fost vizitate
queue.append(vecin)
with open ("graf.in", "r") as reader:
noduri, muchii = reader.readline().strip().split()
noduri = int(noduri) #numarul de noduri
muchii = int(muchii) #numarul de muchii
for i in range (muchii):
left, right = reader.readline().strip().split() #formam lista de adiacenta
graph[int(left)].append(int(right)) #a grafului
graph[int(right)].append(int(left))
puncte_control = []
for punct_control in reader.readline().strip().split():
distance[int(punct_control)] = 0 #distanta de la un punct de control pana la un punct de control este 0
puncte_control.append(int(punct_control)) #salvam punctele de control
for punct_control in puncte_control: #incepem bfs-ul din punctele de control
bfs(punct_control)
for i in range (1, noduri + 1):
print(distance[i], end=" ")
print()