0582 - Turneu

De la Universitas MediaWiki

Un graf orientat se numește graf turneu dacă oricare ar fi două noduri diferite i, j, între ele există un singur arc: arcul (i j) sau arcul (j i). În orice graf turneu există un drum elementar care trece prin toate nodurile grafului.

Cerinţa

Se dă un graf turneu cu n noduri. Să se determine un drum elementar care să conțină toate nodurile grafului.

Date de intrare

Programul citește de la tastatură numărul de noduri n, iar apoi n*(n-1)/2 perechi i j, cu semnificația că există arcul (i j).

Date de ieșire

Programul va afișa pe ecran cele n noduri ale drumului determinat, separate prin exact un spațiu.

Restricţii şi precizări

  • 1 ≤ n ≤ 100
  • orice drum corect determinat este acceptat

Exemplu 1

Intrare
4
1 4
2 1
2 4
3 1
3 2
4 3
Iesire
Datele de intrare corespund restrictiilor impuse
1 4 3 2


Exemplu 2

Intrare
0
Iesire
Datele de intrare nu corespund restrictiilor impuse


Rezolvare

def verifica_restrictii(n, arce):
    # Verifică dacă datele de intrare respectă restricțiile
    if not (1 <= n <= 100) or not all(1 <= i <= n and 1 <= j <= n for i, j in arce):
        return False
    return True


def drum_elementar(n, arce):
    # Crează un dicționar pentru a stoca vecinii fiecărui nod
    vecini = {i: [] for i in range(1, n + 1)}
    for i, j in arce:
        vecini[i].append(j)

    # Alege un nod de start arbitrar
    nod_curent = 1

    # Inițializează drumul cu nodul de start
    drum = [nod_curent]

    # Construiește drumul
    while len(drum) < n:
        for nod in sorted(vecini[nod_curent]):
            if nod not in drum:
                drum.append(nod)
                nod_curent = nod
                break

    return drum


def main():
    n = int(input())
    arce = [tuple(map(int, input().split())) for _ in range(n * (n - 1) // 2)]

    # Verifică dacă datele de intrare respectă restricțiile
    if not verifica_restrictii(n, arce):
        print("Datele de intrare nu corespund restrictiilor impuse")
        return

    print("Datele de intrare corespund restrictiilor impuse")

    # Determină un drum elementar care să conțină toate nodurile grafului
    drum = drum_elementar(n, arce)

    # Afiseaza rezultatul
    print(' '.join(map(str, drum)))


if __name__ == "__main__":
    main()