4158 - Grade11

From Bitnami MediaWiki

Cerinţa[edit | edit source]

Se dă lista arcelor unui graf orientat. Să se determine nodurile care au gradul exterior divizibil cu gradul interior sau gradul interior divizibil cu gradul exterior. Un nod care are gradul exterior sau gradul interior egal cu 0 nu respectă condiția cerută.

Date de intrare[edit | edit source]

Programul citește de la tastatură numărul n de noduri și numărul m de arce, iar apoi lista arcelor, formată din m perechi de forma i j, cu semnificația că există arc orientat de la i la j.

Date de ieșire[edit | edit source]

Programul va afișa pe ecran nodurile cerute, ordonate crescător, separate prin exact un spațiu. Dacă nu există noduri care să respecte proprietatea că au gradul exterior divizibil cu gradul interior sau gradul interior divizibil cu gradul exterior, atunci se va afișa NU EXISTA.

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

  • 1 ≤ n ≤ 100

Exemplu 1[edit | edit source]

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


Exemplu 2[edit | edit source]

Intrare
102 0
Iesire
Datele de intrare nu corespund restrictiilor impuse


Explicatie[edit | edit source]

Vârful 1 are gradul exterior egal cu 3 și gradul interior egal cu 3. Vârful 3 are gradul exterior egal cu 2 și gradul interior egal cu 1. Vârful 4 are gradul exterior egal cu 1 și gradul interior egal cu 1. Vârful 5 are gradul exterior egal cu 1 și gradul interior egal cu 2.

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 noduri_grad_divizibil(n, arce):

   # Inițializează gradele interioare și exterioare ale nodurilor
   grad_interior = [0] * (n + 1)
   grad_exterior = [0] * (n + 1)
   # Calculează gradele interioare și exterioare ale nodurilor
   for i, j in arce:
       grad_exterior[i] += 1
       grad_interior[j] += 1
   # Determină nodurile care au gradul exterior divizibil cu gradul interior
   # sau gradul interior divizibil cu gradul exterior
   noduri = [i for i in range(1, n + 1) if grad_interior[i] != 0 and grad_exterior[i] != 0 and
             (grad_exterior[i] % grad_interior[i] == 0 or grad_interior[i] % grad_exterior[i] == 0)]
   return noduri


def main():

   n, m = map(int, input().split())
   arce = [tuple(map(int, input().split())) for _ in range(m)]
   # 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ă nodurile care au gradul exterior divizibil cu gradul interior
   # sau gradul interior divizibil cu gradul exterior
   noduri = noduri_grad_divizibil(n, arce)
   # Afiseaza rezultatul
   if noduri:
       print(' '.join(map(str, sorted(noduri))))
   else:
       print("NU EXISTA")


if __name__ == "__main__":

   main()


</syntaxhighlight>