4071 - Ciclu L

From Bitnami MediaWiki

Cerinţa[edit | edit source]

Se dă lista muchiilor unui graf neorientat cu n noduri și un număr L. Să se determine un ciclu elementar de lungime L.

Date de intrare[edit | edit source]

Fişierul de intrare ciclulIN.txt conţine pe prima linie numerele n și m, reprezentând numărul de noduri 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 L.

Date de ieşire[edit | edit source]

Fişierul de ieşire ciclulOUT.txt va conține un singur ciclu elementar de lungime L. Acesta va începe și se va termina cu același nod.

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

  • 1 ≤ n ≤ 20
  • 1 ≤ i , j ≤ n
  • 1 ≤ L ≤ n
  • pentru toate datele de test, va exista cel puțin un ciclu de lungime L
  • lungimea unui ciclu este egală cu numărul de muchii.

Exemplul 1:[edit | edit source]

ciclulIN.txt

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

ciclulOUT.txt

3 5 4 6 3

Exemplul 2:[edit | edit source]

ciclulIN.txt

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

ciclulOUT.txt

Datele nu corespund restrictiilor impuse

Rezolvare[edit | edit source]

<syntaxhighlight lang="python3" line="1"> N = 235

def check_constraints(n, m, k):

   if not (1 <= n <= 20) or not (1 <= m <= n*(n-1)//2) or not (1 <= k <= n):
       fout.write("Datele nu corespund restrictiilor impuse\n")
       exit(0)

def cond(j):

   if j > 1 and a[X[j-1]][X[j]] == 0:
       return 0
   if j == k and a[X[j]][X[1]] == 0:
       return 0
   return 1

def afis():

   for i in range(1, k+1):
       fout.write(str(X[i]) + " ")
   fout.write(str(X[1]) + '\n')
   exit(0)

def back(j):

   for i in range(1, n+1):
       if not p[i]:
           X[j] = i
           p[i] = 1
           if cond(j):
               if j == k:
                   afis()
               else:
                   back(j + 1)
           p[i] = 0

if __name__ == "__main__":

   fin = open("ciclulIN.txt", "r")
   fout = open("ciclulOUT.txt", "w")
   a = [[0] * 50 for _ in range(50)]
   n, m = map(int, fin.readline().split())
   check_constraints(n, m, n)  # Assuming k is the same as n
   for _ in range(m):
       x, y = map(int, fin.readline().split())
       a[x][y] = a[y][x] = 1
   k = int(fin.readline())
   check_constraints(n, m, k)
   X = [0] * 50
   p = [0] * 50
   back(1)
   fin.close()
   fout.close()

</syntaxhighlight>