0419 - Subgraf 1

From Bitnami MediaWiki

Cerinţa[edit | edit source]

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

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

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

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

Exemplul 2[edit | edit source]

subgraf1IN.txt

5
1 5
2 5
3 5
2 3
4 2

subgraf1OUT.txt

3

Explicație[edit | edit source]

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

Exemplul 1[edit | edit source]

subgraf1IN.txt

101

subgraf1OUT.txt

Datele nu corespund restrictiilor impuse

Rezolvare[edit | edit source]

<syntaxhighlight lang="python3" line="1"> 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()

</syntaxhighlight>