0477 - Lanturi 1
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 nu conțin vârful r
.
Date de intrare[edit | edit source]
Fişierul de intrare lanturi1IN.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 lanturi1OUT.txt
va conține, în ordine lexicografică, toate lanțurile elementare cu extremitățile în p
, respectiv q
, care nu 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]
lanturi1IN.txt
5 8 1 4 1 3 3 5 4 5 2 4 1 2 4 2 3 4 2 5 3
lanturi1OUT.txt
2 1 4 5 2 4 5
Exemplul 2:[edit | edit source]
lanturi1IN.txt
100 100 1 4 1 3 3 5 4 5 2 4 1 2 4 2 3 4 2 5 3
lanturi1OUT.txt
Datele nu corespund restrictiilor impuse
Rezolvare[edit | edit source]
<syntaxhighlight lang="python3" line="1"> def is_valid_edge(u, v, path, r, visited):
return v != r and v not in path and not visited[v]
def generate_paths(graph, p, q, r, n):
def backtrack(current, path, visited): visited[current] = True
if current == q: result.append(path[:]) visited[current] = False return
for neighbor in graph[current]: if is_valid_edge(current, neighbor, path, r, visited): path.append(neighbor) backtrack(neighbor, path, visited) path.pop()
visited[current] = False
result = [] visited = {i: False for i in range(1, n + 1)} backtrack(p, [p], visited) return result
def check_restrictions(n, m, edges, p, q, r):
if not (1 <= n <= 20 and 1 <= p <= n and 1 <= q <= n and 1 <= r <= n and p != q != r): with open('lanturi1OUT.txt', 'w') as output_file: output_file.write("Datele nu corespund restrictiilor impuse\n") return False
for edge in edges: u, v = edge if not (1 <= u <= n and 1 <= v <= n): with open('lanturi1OUT.txt', 'w') as output_file: output_file.write("Datele nu corespund restrictiilor impuse\n") return False
return True
def main():
with open('lanturi1IN.txt', 'r') as input_file: n, m = map(int, input_file.readline().split()) edges = [tuple(map(int, input_file.readline().split())) for _ in range(m)] line = input_file.readline().split() if len(line) < 3: with open('lanturi1OUT.txt', 'w') as output_file: output_file.write("Datele nu corespund restrictiilor impuse\n") return
p, q, r = map(int, line)
if not check_restrictions(n, m, edges, p, q, r): return
graph = {i: [] for i in range(1, n + 1)} for edge in edges: u, v = edge graph[u].append(v) graph[v].append(u)
paths = generate_paths(graph, p, q, r, n) unique_paths = [list(item) for item in set(tuple(path) for path in paths)] unique_paths.sort()
with open('lanturi1OUT.txt', 'w') as output_file: for path in unique_paths: output_file.write(" ".join(map(str, path)) + "\n")
if __name__ == "__main__":
main()
</syntaxhighlight>