4152 - Lant Maxim 1

From Bitnami MediaWiki

Cerinţa[edit | edit source]

Se dă lista muchiilor unui graf neorientat cu n vârfuri și un vârf q. Să se determine cel mai lung lanț elementar cu extremitatea finală în q.

Date de intrare[edit | edit source]

Fişierul de intrare lantmaxim1IN.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 q.

Date de ieşire[edit | edit source]

Fişierul de ieşire lantmaxim1OUT.txt va conține cel mai lung lanț elementar cu extremitățile p și q, vârfurile sale fiind separate prin exact un spațiu. Dacă sunt mai multe lanțuri de lungime maximă, se va afișa primul în ordine lexicografică.Î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
  • 1 ≤ q ≤ n

Exemplul 1:[edit | edit source]

lantmaxim1IN.txt

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

lantmaxim1OUT.txt

2 1 3 4 5 

Exemplul 2:[edit | edit source]

lantmaxim1IN.txt

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

lantmaxim1OUT.txt

Nu corespunde restrictiilor impuse

Rezolvare[edit | edit source]

<syntaxhighlight lang="python3" line="1"> def verifica_restrictii(n, muchii, q):

   if not (1 <= n <= 20):
       return False
   for u, v in muchii:
       if not (1 <= u <= n) or not (1 <= v <= n):
           return False
   if not (1 <= q <= n):
       return False
   return True

def gestionare_restrictii(file_path_out):

   with open(file_path_out, 'w') as file_out:
       file_out.write("Nu corespunde restrictiilor impuse")
   exit()

def citeste_graf(file_path):

   with open(file_path, 'r') as file:
       n, m = map(int, file.readline().split())
       muchii = [tuple(map(int, file.readline().split())) for _ in range(m)]
       try:
           q = int(file.readline())
       except ValueError:
           gestionare_restrictii("lantmaxim1OUT.txt")
   if not verifica_restrictii(n, muchii, q):
       gestionare_restrictii("lantmaxim1OUT.txt")
   return n, muchii, q

def dfs_lant_maxim(q, graf, vizitat, path, lant_maxim):

   vizitat[q] = True
   path.append(q)
   for vecin in graf[q]:
       if not vizitat[vecin]:
           dfs_lant_maxim(vecin, graf, vizitat, path, lant_maxim)
   if len(path) >= len(lant_maxim):
       lant_maxim.clear()
       lant_maxim.extend(path)
   path.pop()
   vizitat[q] = False

def lungime_lant(q, graf, vizitat):

   lant_maxim = []
   dfs_lant_maxim(q, graf, vizitat, [], lant_maxim)
   return len(lant_maxim), lant_maxim

def gaseste_lant_maxim(n, muchii, q):

   graf = {i: [] for i in range(1, n + 1)}
   for u, v in muchii:
       graf[u].append(v)
       graf[v].append(u)
   vizitat = {i: False for i in range(1, n + 1)}
   lungime_maxima = 0
   lant_maxim = []
   for v in range(1, n + 1):
       if not vizitat[v]:
           lungime, lant = lungime_lant(v, graf, vizitat)
           if lungime > lungime_maxima:
               lungime_maxima = lungime
               lant_maxim = lant
   return lant_maxim

def scrie_lant_maxim(file_path, lant_maxim):

   with open(file_path, 'w') as file:
       file.write(' '.join(map(str, lant_maxim)) + '\n')

if __name__ == "__main__":

   file_in = "lantmaxim1IN.txt"
   file_out = "lantmaxim1OUT.txt"
   n, muchii, q = citeste_graf(file_in)
   lant_maxim = gaseste_lant_maxim(n, muchii, q)
   if lant_maxim:
       scrie_lant_maxim(file_out, lant_maxim)
   else:
       with open(file_out, 'w') as file_out:
           file_out.write("Nu corespunde restrictiilor impuse")

</syntaxhighlight>