4282 - Nr Comp Conexe 1

From Bitnami MediaWiki

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 nrcompconexe1IN.txtconț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 nrcompconexe1OUT.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 ≤ 30.000
  • 1 ≤ m ≤ min(n * (n - 1) / 2, 100.000)

Exemplul 1[edit | edit source]

nrcompconexe1IN.txt

7 5
3 1
4 5
5 6
3 2
1 2

nrcompconexe1OUT.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 l[edit | edit source]

nrcompconexe1IN.txt

1 2

nrcompconexe1OUT.txt

Datele nu corespund restrictiilor impuse

Rezolvare[edit | edit source]

<syntaxhighlight lang="python3" line="1"> 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
  1. 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)]
  1. Verificare restricții

if not verificare_restrictii(n, m):

   exit()
  1. Calculul numărului de componente conexe

rezultat = numara_componente_conexe(n, muchii)

  1. Scrierea rezultatului în fișierul de ieșire

with open("nrcompconexe1OUT.txt", "w") as fisier_iesire:

   fisier_iesire.write(str(rezultat))

</syntaxhighlight>