4282 - Nr Comp Conexe 1
De la Universitas MediaWiki
Cerința
Dându-se un graf neorientat cu n
noduri și m
muchii, să se determine numărul componentelor conexe.
Date de intrare
Fișierul de intrare nrcompconexe1IN.txt
conține pe prima linie numerele n
și m
, iar pe următoarele m
linii se află câte două numere i
și j
cu semnificația că există în graf muchia (i, j)
.
Date de ieșire
Fișierul de ieșire nrcompconexe1OUT.txt
va conține pe prima linie un singur număr natural reprezentând numărul componentelor conexe.
Restricții și precizări
3 ≤ n ≤ 30.000
1 ≤ m ≤ min(n * (n - 1) / 2, 100.000)
Exemplul 1
nrcompconexe1IN.txt
7 5 3 1 4 5 5 6 3 2 1 2
nrcompconexe1OUT.txt
3
Explicație
Există trei componente conexe, una formată din nodurile 1,2,3
, a doua formată din 4,5,6
și ultima componentă conexă formată doar din nodul izolat 7
.
Exemplul l
nrcompconexe1IN.txt
1 2
nrcompconexe1OUT.txt
Datele nu corespund restrictiilor impuse
Rezolvare
def verificare_restrictii(n, m):
if not (3 <= n <= 30000) or not (1 <= m <= min(n * (n - 1) // 2, 100000)):
with open("nrcompconexe1OUT.txt", "w") as fisier_iesire:
fisier_iesire.write("Datele nu corespund restrictiilor impuse")
return False
return True
def dfs(nod, vizitat, lista_adiacenta):
vizitat[nod] = True
for vecin in lista_adiacenta[nod]:
if not vizitat[vecin]:
dfs(vecin, vizitat, lista_adiacenta)
def numara_componente_conexe(n, muchii):
lista_adiacenta = {i: [] for i in range(1, n + 1)}
for muchie in muchii:
lista_adiacenta[muchie[0]].append(muchie[1])
lista_adiacenta[muchie[1]].append(muchie[0])
vizitat = {i: False for i in range(1, n + 1)}
componente = 0
for nod in range(1, n + 1):
if not vizitat[nod]:
dfs(nod, vizitat, lista_adiacenta)
componente += 1
return componente
# Citirea datelor de intrare
with open("nrcompconexe1IN.txt", "r") as fisier_intrare:
n, m = map(int, fisier_intrare.readline().split())
muchii = [tuple(map(int, fisier_intrare.readline().split())) for _ in range(m)]
# Verificare restricții
if not verificare_restrictii(n, m):
exit()
# Calculul numărului de componente conexe
rezultat = numara_componente_conexe(n, muchii)
# Scrierea rezultatului în fișierul de ieșire
with open("nrcompconexe1OUT.txt", "w") as fisier_iesire:
fisier_iesire.write(str(rezultat))