1604 - D Min

De la Universitas MediaWiki
Versiunea pentru tipărire nu mai este suportată și poate avea erori de randare. Vă rugăm să vă actualizați bookmarkurile browserului și să folosiți funcția implicită de tipărire a browserului.

Enunț

Se consideră un graf neorientat conex cu n vârfuri, 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

Se dau k perechi de vârfuri x y. Determinați pentru fiecare pereche distanța minimă dintre x și y.

Date de intrare

Fişierul de intrare dminIN.txt conţine pe prima linie două numere n şi m, reprezentând numărul de noduri, respectiv numărul de muchii. 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.

Următoarea linie conține un număr k, iar următoarele k linii câte două numere x y.

Date de ieşire

Fişierul de ieşire dminOUT.txt va conţine k linii. Fiecare linie va conține distanța minimă dintre nodurile x y din fișierul de intrare, în ordinea din fișierul de intrare.

Restricţii şi precizări

  • n ≤ 100
  • k ≤ 100
  • pentru toate perechile x y există cel puțin un drum elementar de la x la y.

Exemplul 1

dminIN.txt

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

dminOUT.txt

4
2
2

Exemplul 2

dminIN.txt

101 101

dminOUT.txt

Datele nu corespund restrictiilor impuse

Rezolvare

def verificare_restrictii(n, k):
    if n > 100 or k > 100:
        return False
    return True

def bfs(GRAF, start, sfarsit):
    vizitate = set()
    coada = [[start]]

    if start == sfarsit:
        return 0

    while coada:
        drum = coada.pop(0)
        nod = drum[-1]

        if nod not in vizitate:
            vecini = GRAF[nod]
            for vecin in vecini:
                drum_nou = list(drum)
                drum_nou.append(vecin)
                coada.append(drum_nou)

                if vecin == sfarsit:
                    return len(drum_nou) - 1

            vizitate.add(nod)

    return -1  # Dacă nu există drum între noduri

def main():
    with open('dminIN.txt', 'r') as fisier_intrare:
        n, m = map(int, fisier_intrare.readline().split())

        if not verificare_restrictii(n, m):
            with open('dminOUT.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)

        k = int(fisier_intrare.readline())
        interogari = [tuple(map(int, fisier_intrare.readline().split())) for _ in range(k)]

    with open('dminOUT.txt', 'w') as fisier_iesire:
        for interogare in interogari:
            x, y = interogare
            distanta = bfs(GRAF, x, y)
            fisier_iesire.write(str(distanta) + '\n')

if __name__ == "__main__":
    main()