4276 - Nr Comp Conexe
Cerința[edit | edit source]
Dându-se un graf neorientat cu n
noduri și m
muchii, să se determine numărul componentelor conexe.
Date de intrare[edit | edit source]
Fișierul de intrare nrcompconexeIN.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[edit | edit source]
Fișierul de ieșire nrcompconexeOUT.txt
va conține pe prima linie un singur număr natural reprezentând numărul componentelor conexe.
Restricții și precizări[edit | edit source]
3 ≤ n ≤ 100
1 ≤ m ≤ n * (n - 1) / 2
Exemplul 1[edit | edit source]
nrcompconexeIN.txt
7 5 3 1 4 5 5 6 3 2 1 2
nrcompconexeOUT.txt
3
Explicație[edit | edit source]
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 1[edit | edit source]
nrcompconexeIN.txt
101 67
nrcompconexeOUT.txt
Datele nu corespund restrictiilor impuse
Rezolvare[edit | edit source]
<syntaxhighlight lang="python3" line="1"> def verifica_restrictii(n, m):
if not (3 <= n <= 100 and 1 <= m <= n * (n - 1) / 2): with open("nrcompconexeOUT.txt", "w") as fisier_out: fisier_out.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 numar_componente_conexe(n, m, muchii):
lista_adiacenta = {i: [] for i in range(1, n + 1)} for i, j in muchii: lista_adiacenta[i].append(j) lista_adiacenta[j].append(i)
vizitat = {i: False for i in range(1, n + 1)} numar_conexe = 0
for nod in range(1, n + 1): if not vizitat[nod]: dfs(nod, vizitat, lista_adiacenta) numar_conexe += 1
return numar_conexe
- Citirea datelor de intrare
with open("nrcompconexeIN.txt", "r") as fisier:
n, m = map(int, fisier.readline().split()) if not verifica_restrictii(n, m): exit() muchii = [tuple(map(int, fisier.readline().split())) for _ in range(m)]
- Calculul numărului de componente conexe
rezultat = numar_componente_conexe(n, m, muchii)
- Scrierea rezultatului în fișierul de ieșire
with open("nrcompconexeOUT.txt", "w") as fisier_out:
fisier_out.write(str(rezultat))
</syntaxhighlight>