4071 - Ciclu L

From Bitnami MediaWiki

Cerinţa

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

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

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

  • 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:

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:

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

<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>