0476 - Lanturi
Cerinţa[edit | edit source]
Se dă lista muchiilor unui graf neorientat cu n
vârfuri și trei vârfuri p q r
. Să se determine toate lanțurile elementare cu extremitățile în p
și q
care conțin vârful r
.
Date de intrare[edit | edit source]
Fişierul de intrare lanturiIN.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 trei numere p q r
, cu semnificația precizată.
Date de ieşire[edit | edit source]
Fişierul de ieşire lanturiOUT.txt
va conține, în ordine lexicografică, toate lanțurile elementare cu extremitățile în p
, respectiv q
, care conțin vârful r
, fiecare lanț fiind afișat pe câte o linie a fișierului, vârfurile dintr-un lanț fiind separate prin exact un spațiu.Î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 , q , r ≤ n
p
,q
șir
sunt diferite
Exemplul 1:[edit | edit source]
lanturiIN.txt
5 8 1 4 1 3 3 5 4 5 2 4 1 2 4 2 3 4 2 5 3
lanturiOUT.txt
2 1 3 4 5 2 1 3 5 2 1 4 3 5 2 4 1 3 5 2 4 3 5
Exemplul 2:[edit | edit source]
lanturiIN.txt
100 100 1 4 1 3 3 5 4 5 2 4 1 2 4 2 3 4 2 5 3
lanturiOUT.txt
Nu corespunde restrictiilor impuse
Rezolvare[edit | edit source]
<syntaxhighlight lang="python3" line="1"> def gaseste_lanturi_elementare(graph, p, q, r):
def dfs(curent, cale): nonlocal rezultat vizitat[curent] = True cale.append(curent)
if curent == q: if r in cale: rezultat.add(tuple(cale)) else: for vecin in graph[curent]: if not vizitat[vecin]: dfs(vecin, cale)
vizitat[curent] = False cale.pop()
rezultat = set() vizitat = [False] * (n + 1) dfs(p, [])
return rezultat
def verifica_restrictii(n, p, q, r):
if not (1 <= n <= 20) or not (1 <= p <= n) or not (1 <= q <= n) or not (1 <= r <= n) or p == q or p == r or q == r: return False return True
def citeste_intrare(nume_fisier):
with open(nume_fisier, 'r') as fisier: try: n, m = map(int, fisier.readline().split()) graf = {i: [] for i in range(1, n + 1)}
for _ in range(m): linie = fisier.readline().split() if len(linie) != 2: raise ValueError("Nu corespunde restrictiilor impuse") i, j = map(int, linie) graf[i].append(j) graf[j].append(i)
linie = fisier.readline().split() if len(linie) != 3: raise ValueError("Nu corespunde restrictiilor impuse")
p, q, r = map(int, linie)
if not (1 <= p <= n) or not (1 <= q <= n) or not (1 <= r <= n) or p == q or p == r or q == r: raise ValueError("Nu corespunde restrictiilor impuse")
except ValueError as e: with open('lanturiOUT.txt', 'w') as fisier_iesire: fisier_iesire.write(f"Nu corespunde restrictiilor impuse") exit()
return n, graf, p, q, r
def scrie_iesire(nume_fisier, lanturi):
with open(nume_fisier, 'w') as fisier: if lanturi == "Nu corespunde restricțiilor impuse": fisier.write(lanturi) else: for lant in lanturi: fisier.write(' '.join(map(str, lant)) + '\n')
if __name__ == '__main__':
fisier_intrare = 'lanturiIN.txt' fisier_iesire = 'lanturiOUT.txt'
n, graf, p, q, r = citeste_intrare(fisier_intrare)
if not verifica_restrictii(n, p, q, r): scrie_iesire(fisier_iesire, "Nu corespunde restrictiilor impuse") else: lanturi = gaseste_lanturi_elementare(graf, p, q, r) lanturi = [list(lant) for lant in lanturi] lanturi.sort()
scrie_iesire(fisier_iesire, lanturi)
</syntaxhighlight>