4074 - Distante

From Bitnami MediaWiki

Enunț[edit | edit source]

Se consideră un graf neorientat conex cu n noduri, numerotate de la 1 la n, şi m muchii. Definim distanţa minimă dintre două noduri x şi y ca fiind numărul minim de muchii al unui lanţ elementar care uneşte x cu y.

Cerinţa[edit | edit source]

Se dă o pereche de noduri p q. Determinați nodurile r cu proprietatea că distanța minimă dintre p și r este egală cu distanța minimă dintre r și q.

Date de intrare[edit | edit source]

Fişierul de intrare distanteIN.txt conţine pe prima linie numere n m p q. Fiecare dintre următoarele m linii va conţine câte două numere x şi y, separate printr-un spaţiu, cu semnificaţia: există o muchie între nodul x şi nodul y.

Date de ieşire[edit | edit source]

Fişierul de ieşire distanteOUT.txt va conține pe prime linie, separate prin câte un spațiu, modurile cerute în ordine crescătoare.

Restricţii şi precizări[edit | edit source]

  • n ≤ 1000

Exemplul 1[edit | edit source]

distanteIN.txt

7 8 2 4
1 2
2 3
2 6
3 4
3 6
3 7
4 5
4 6

distanteOUT.txt

3 6 7 

Exemplul 2[edit | edit source]

distanteIN.txt

1001 86 37 3

distanteOUT.txt

Datele nu corespund restrictiilor impuse

Rezolvare[edit | edit source]

<syntaxhighlight lang="python3" line="1"> from collections import deque

def bfs(graf, start):

   distante = {nod: float('inf') for nod in graf}
   distante[start] = 0
   coada = deque([start])
   while coada:
       nod_curent = coada.popleft()
       for vecin in graf[nod_curent]:
           if distante[vecin] == float('inf'):
               distante[vecin] = distante[nod_curent] + 1
               coada.append(vecin)
   return distante

def gaseste_noduri_potrivite(graf, p, q):

   distante_p = bfs(graf, p)
   distante_q = bfs(graf, q)
   noduri_potrivite = []
   for nod in graf:
       if distante_p[nod] == distante_q[nod]:
           noduri_potrivite.append(nod)
   return noduri_potrivite

def main():

   with open("distanteIN.txt", "r") as fisier_intrare:
       n, m, p, q = map(int, fisier_intrare.readline().split())
       if n > 1000:
           with open("distanteOUT.txt", "w") as fisier_iesire:
               fisier_iesire.write("Datele nu corespund restrictiilor impuse")
           return
       graf = {i: [] for i in range(1, n + 1)}
       for _ in range(m):
           x, y = map(int, fisier_intrare.readline().split())
           graf[x].append(y)
           graf[y].append(x)
   noduri_potrivite = gaseste_noduri_potrivite(graf, p, q)
   with open("distanteOUT.txt", "w") as fisier_iesire:
       if n <= 1000:
           fisier_iesire.write(" ".join(map(str, noduri_potrivite)))
       else:
           fisier_iesire.write("Datele nu corespund restrictiilor impuse")

if __name__ == "__main__":

   main()

</syntaxhighlight>