0478 - Ciclu

From Bitnami MediaWiki

Cerinţa[edit | edit source]

Se dă lista muchiilor unui graf neorientat cu n vârfuri și un vârf p. Să se determine un ciclu elementar care conține vârful p.

Date de intrare[edit | edit source]

Fişierul de intrare cicluIN.txt conţine pe prima linie numerele n și m, reprezentând numărul de vârfuri ale grafului și numărul de muchii date în continuare. Fiecare dintre următoarele m linii conține câte o pereche de numere i j, cu semnificația că există muchie între i și j.

Următoarea linie conține numărul p.

Date de ieşire[edit | edit source]

Fişierul de ieşire cicluOUT.txt va conține un singur ciclu elementar care conține vârful p. Acesta va începe și se va termina cu vârful p.În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul "Nu corespunde restricțiilor impuse".

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

  • 1 ≤ n ≤ 20
  • 1 ≤ i , j ≤n
  • muchiile se pot repeta în fișierul de intrare
  • 1 ≤ p ≤ n
  • pentru toate datele de test, va exista cel puțin un ciclu care conține vârful p

Exemplul 1:[edit | edit source]

cicluIN.txt

5 8
1 4 
1 3 
3 5 
4 5 
2 4 
1 2 
4 2 
3 4
2

cicluOUT.txt

2 1 3 4 2

Exemplul 2:[edit | edit source]

cicluIN.txt

21 8
1 4 
1 3 
3 5 
4 5 
2 4 
1 2 
4 2 
3 4
2

cicluOUT.txt

"Datele nu corespund restrictiilor impuse"

Rezolvare[edit | edit source]

<syntaxhighlight lang="python3" line="1"> def check_restrictions(n, m, edges, p):

   # Check constraints
   if not (1 <= n <= 20):
       return False
   for i, j in edges:
       if not (1 <= i <= n) or not (1 <= j <= n):
           return False
   if not (1 <= p <= n):
       return False
   return True

def afis(k):

   global gasit
   for i in range(1, k + 1):
       fout.write(str(x[i]) + " ")
   fout.write(str(p) + " ")
   gasit = 1

def OK(k):

   if a[x[k - 1]][x[k]] != 1:
       return 0
   for i in range(1, k):
       if x[k] == x[i]:
           return 0
   return 1

def back(k):

   global gasit
   for i in range(1, n + 1):
       x[k] = i
       if not gasit and OK(k):
           if a[x[k]][p] == 1 and k > 2:
               afis(k)
           back(k + 1)

if __name__ == "__main__":

   fin = open("cicluIN.txt", "r")
   fout = open("cicluOUT.txt", "w")
   n, m = map(int, fin.readline().split())
   edges = [tuple(map(int, fin.readline().split())) for _ in range(m)]
   # Read the line and strip any leading or trailing whitespace
   p_line = fin.readline().strip()
   # Check if the line is not empty before converting to an integer
   if p_line:
       p = int(p_line)
   else:
       fout.write("Datele nu corespund restrictiilor impuse")
       fin.close()
       fout.close()
       exit()
   # Check restrictions
   if not check_restrictions(n, m, edges, p):
       fout.write("Datele nu corespund restrictiilor impuse")
   else:
       a = [[0] * (n + 1) for _ in range(n + 1)]
       for i, j in edges:
           a[i][j] = a[j][i] = 1
       x = [0] * 205
       gasit = 0
       x[1] = p
       back(2)
   fin.close()
   fout.close()

</syntaxhighlight>