0582 - Turneu

From Bitnami MediaWiki
Revision as of 15:08, 4 January 2024 by Codrut Borcutean (talk | contribs) (Pagină nouă: 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 '''...)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

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[edit | edit source]

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

Date de intrare[edit | edit source]

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[edit | edit source]

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

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

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

Exemplu 1[edit | edit source]

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[edit | edit source]

Intrare
0
Iesire
Datele de intrare nu corespund restrictiilor impuse


Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line> 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()


</syntaxhighlight>