0437 - Conex
De la Universitas MediaWiki
Cerinţa
Se dă lista muchiilor unui graf neorientat. Să se verifice dacă graful este sau nu conex.
Date de intrare
Fişierul de intrare conexIN.txt
conţine pe prima linie numărul n
, reprezentând numărul de vârfuri ale grafului. Fiecare dintre următoarele linii conține câte o pereche de numere i j
, cu semnificația că există muchie între i
și j
.
Date de ieşire
Fişierul de ieşire conexOUT.txt
va conţine mesajul DA
, dacă graful dat este conex, respectiv NU
, în caz contrar.
Restricţii şi precizări
1 ≤ n ≤ 100
1 ≤ i , j ≤ n
- în fișierul de intrare muchiile se pot repeta
Exemplul 1
conexIN.txt
5 1 4 3 5 2 4
conexOUT.txt
NU
Exemplul 2
conexIN.txt
101
conexOUT.txt
Datele nu corespund restrictiilor impuse
Rezolvare
def respecta_restrictii(n, muchii):
return 1 <= n <= 100 and all(1 <= i <= n and 1 <= j <= n for i, j in muchii)
def este_conex(n, muchii):
# Verifică restricțiile
if not respecta_restrictii(n, muchii):
return "Datele nu corespund restrictiilor impuse"
# Restul codului rămâne neschimbat
lista_adiacenta = {i: set() for i in range(1, n + 1)}
for muchie in muchii:
x, y = muchie
lista_adiacenta[x].add(y)
lista_adiacenta[y].add(x)
vizitat = set()
def dfs(nod):
vizitat.add(nod)
for vecin in lista_adiacenta[nod]:
if vecin not in vizitat:
dfs(vecin)
# Folosim DFS pentru a vizita toate nodurile din graf
dfs(1)
# Verificăm dacă toate nodurile au fost vizitate
return "DA" if len(vizitat) == n else "NU"
# Citirea din fișierul de intrare
with open("conexIN.txt", "r") as fisier:
n = int(fisier.readline())
muchii = [tuple(map(int, linie.split())) for linie in fisier]
# Verifică restricțiile și scrie rezultatul în fișierul de ieșire
with open("conexOUT.txt", "w") as fisier:
rezultat = este_conex(n, muchii)
fisier.write(rezultat)