0419 - Subgraf 1

De la Universitas MediaWiki

Cerinţa

Se dă lista muchiilor unui graf neorientat cu n vârfuri, etichetate de la 1 la n. Din acest graf se elimină toate vârfurile care au gradul minim. Să se determine câte muchii va avea subgraful obținut.

Date de intrare

Fişierul de intrare subgraf1IN.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 subgraf1OUT.txt va conţine pe prima linie numărul M de muchii ale subgrafului obținut.

Restricţii şi precizări

  • 1 ≤ n ≤ 100
  • 1 ≤ i , j ≤ n
  • muchiile se pot repeta în fișierul de intrare

Exemplul 2

subgraf1IN.txt

5
1 5
2 5
3 5
2 3
4 2

subgraf1OUT.txt

3

Explicație

Se elimină vârfurile 1 4. Subgraful obținut va conține vârfurile 2 3 5, cu 3 muchii.

Exemplul 1

subgraf1IN.txt

101

subgraf1OUT.txt

Datele nu corespund restrictiilor impuse

Rezolvare

def citeste_graf(fisier):
    with open(fisier, 'r') as file:
        n = int(file.readline().strip())
        muchii = [tuple(map(int, linie.strip().split())) for linie in file]

    return n, muchii

def scrie_iesire(fisier, numar_muchii):
    with open(fisier, 'w') as file:
        file.write(str(numar_muchii))

def verifica_restricții(n, muchii):
    # Verifică restricția 1: 1 ≤ n ≤ 100
    if not (1 <= n <= 100):
        raise ValueError("Datele nu corespund restrictiilor impuse")

    # Verifică restricția 2: 1 ≤ i, j ≤ n pentru fiecare muchie
    if not all(1 <= i <= n and 1 <= j <= n for i, j in muchii):
        raise ValueError("Datele nu corespund restrictiilor impuse")

def construieste_graf(n, muchii):
    graf = {i: [] for i in range(1, n + 1)}
    for muchie in muchii:
        graf[muchie[0]].append(muchie[1])
        graf[muchie[1]].append(muchie[0])
    return graf

def gaseste_varfurile_cu_grad_minim(graf):
    grade = {v: len(adiacenti) for v, adiacenti in graf.items()}
    grad_minim = min(grade.values())
    varfuri_grad_minim = [v for v, grad in grade.items() if grad == grad_minim]
    return varfuri_grad_minim

def elimina_varfurile_cu_grad_minim(graf, varfuri_grad_minim):
    for v in varfuri_grad_minim:
        del graf[v]
        for u, adiacenti in graf.items():
            graf[u] = [w for w in adiacenti if w != v]
    return graf

def main():
    fisier_intrare = 'subgraf1IN.txt'
    fisier_iesire = 'subgraf1OUT.txt'

    try:
        n, muchii = citeste_graf(fisier_intrare)

        # Adaugă verificarea restricțiilor
        verifica_restricții(n, muchii)

        graf = construieste_graf(n, muchii)

        varfuri_grad_minim = gaseste_varfurile_cu_grad_minim(graf)
        graf_nou = elimina_varfurile_cu_grad_minim(graf.copy(), varfuri_grad_minim)

        numar_muchii = sum(len(adiacenti) for adiacenti in graf_nou.values()) // 2
        scrie_iesire(fisier_iesire, numar_muchii)

    except ValueError as e:
        with open(fisier_iesire, 'w') as file:
            file.write(str(e))

if __name__ == "__main__":
    main()