Cod sursa(job #2929849)

Utilizator tudorcioc5Cioc Tudor tudorcioc5 Data 26 octombrie 2022 23:33:10
Problema Componente tare conexe Scor 0
Compilator py Status done
Runda Arhiva educationala Marime 2.43 kb

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()