4276 - Nr Comp Conexe

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 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

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

  • 3 ≤ n ≤ 100
  • 1 ≤ m ≤ n * (n - 1) / 2

Exemplul 1

nrcompconexeIN.txt

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

nrcompconexeOUT.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 1

nrcompconexeIN.txt

101 67

nrcompconexeOUT.txt

Datele nu corespund restrictiilor impuse

Rezolvare

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))