0548 - Hamilton: Difference between revisions
Line 45: | Line 45: | ||
# Check constraints 1 ≤ n ≤ 10 | # Check constraints 1 ≤ n ≤ 10 | ||
if not (1 <= n <= 10): | if not (1 <= n <= 10): | ||
with open(" | with open("hamiltonout.txt", "w") as g: | ||
g.write(" | g.write("Nu au fost respectate cerintele impuse\n") | ||
return False | return False | ||
Line 53: | Line 53: | ||
for j in range(1, n + 1): | for j in range(1, n + 1): | ||
if not (0 <= a[i][j] <= 1): # Corrected condition here | if not (0 <= a[i][j] <= 1): # Corrected condition here | ||
with open(" | with open("hamiltonout.txt", "w") as g: | ||
g.write(" | g.write("Nu au fost respectate cerintele impuse\n") | ||
return False | return False | ||
Line 90: | Line 90: | ||
def afisare(): | def afisare(): | ||
global k, ns | global k, ns | ||
with open(" | with open("hamiltonout.txt", "a") as g: | ||
g.write("1\n") | g.write("1\n") | ||
g.write(" ".join(map(str, st[1:n + 1])) + " " + str(st[1]) + "\n") | g.write(" ".join(map(str, st[1:n + 1])) + " " + str(st[1]) + "\n") | ||
Line 96: | Line 96: | ||
ns += 1 | ns += 1 | ||
with open(" | with open("hamiltonin.txt", "r") as f: | ||
n = int(f.readline().strip()) | n = int(f.readline().strip()) | ||
a = [[0] * (n + 1) for _ in range(n + 1)] | a = [[0] * (n + 1) for _ in range(n + 1)] | ||
Line 110: | Line 110: | ||
st = [0] * 100 | st = [0] * 100 | ||
with open(" | with open("hamiltonout.txt", "w") as g: | ||
backtracking() | backtracking() | ||
if ns == 0: | if ns == 0: |
Latest revision as of 16:52, 8 January 2024
Cerința[edit | edit source]
Se dă un graf neorientat cu n vârfuri. Determinați, dacă există, un ciclu hamiltonian.
Date de intrare[edit | edit source]
Fișierul de intrare hamiltonin.txt conține pe prima linie numărul n, iar pe a următoarele linii perechi de numere i j, cu semnificația că există muchie de la i la j.
Date de ieșire[edit | edit source]
Fișierul de ieșire hamiltonout.txt va conține pe prima linie numărul 1, dacă s-a determinat un ciclu hamiltonian, respectiv 0, în caz contrar. Dacă s-a determinat un ciclu hamiltonian, pe linia următoare se vor afișa vârfurile acestui ciclu, separate prin exact un spațiu.
Restricții și precizări[edit | edit source]
- 1 ⩽ n ⩽ 10
- 1 ⩽ i, j ⩽ n
- în ciclul afișat, primul și ultimul vârf sunt egale
- orice ciclu hamiltonian afișat va fi acceptat
Exemplu 1[edit | edit source]
- hamiltonin.txt
- 9
- 1 2
- 1 4
- 2 3
- 2 4
- 2 5
- 3 4
- 3 8
- 3 9
- 4 6
- 5 6
- 5 7
- 5 8
- 7 8
- 8 9
- hamiltonout.txt
- 1
- 1 2 3 9 8 7 5 6 4 1
Exemplu 2[edit | edit source]
- hamiltonin.txt
- 0
- 0 0
- hamiltonout.txt
- Nu au fost respectate cerintele impuse
Rezolvare[edit | edit source]
<syntaxhighlight lang="python" line>
- 0548 - Hamilton
def check_constraints(n, a):
# Check constraints 1 ≤ n ≤ 10 if not (1 <= n <= 10): with open("hamiltonout.txt", "w") as g: g.write("Nu au fost respectate cerintele impuse\n") return False
# Check constraints 1 ≤ i, j ≤ n for i in range(1, n + 1): for j in range(1, n + 1): if not (0 <= a[i][j] <= 1): # Corrected condition here with open("hamiltonout.txt", "w") as g: g.write("Nu au fost respectate cerintele impuse\n") return False
return True
def backtracking():
global k k = 1 while k > 0: if st[k] < n: st[k] += 1 if e_valid(): if k == n: afisare() else: k += 1 st[k] = 0 else: k -= 1
def e_valid():
global k if k > 1: if not a[st[k - 1]][st[k]]: return 0 else: for i in range(1, k): if st[i] == st[k]: return 0 if k == n: if not a[st[1]][st[k]]: return 0 return 1
def afisare():
global k, ns with open("hamiltonout.txt", "a") as g: g.write("1\n") g.write(" ".join(map(str, st[1:n + 1])) + " " + str(st[1]) + "\n") k = 0 ns += 1
with open("hamiltonin.txt", "r") as f:
n = int(f.readline().strip()) a = [[0] * (n + 1) for _ in range(n + 1)] for line in f: u, v = map(int, line.strip().split()) a[u][v] = a[v][u] = 1
- Check constraints before proceeding with backtracking
if not check_constraints(n, a):
exit()
ns = 0 st = [0] * 100
with open("hamiltonout.txt", "w") as g:
backtracking() if ns == 0: g.write("0\n")
</syntaxhighlight>