0420 - Graf Partial

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 muchiile cu proprietatea că ambele extremități au aceeași paritate. Să se determine câte muchii va avea graful parțial obținut.

Date de intrare[edit | edit source]

Fişierul de intrare graf_partialIN.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 graf_partialOUT.txt va conţine pe prima linie numărul M de muchii ale grafului parțial 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 1[edit | edit source]

graf_partialIN.txt

5
1 4
3 5
2 3
2 1
4 2
3 2
1 3

graf_partialOUT.txt

3

Explicație[edit | edit source]

Se elimină muchiile (3 5), (4 2), (1 3). Graful parțial obținut va avea muchiile (1 4), (2 3) și (2 1).

Exemplul 1[edit | edit source]

graf_partialIN.txt

1000

graf_partialOUT.txt

Datele nu corespund restrictiilor impuse

Rezolvare[edit | edit source]

<syntaxhighlight lang="python3" line="1"> def verificare_restricții(n, muchii):

   # Verifică restricția 1: 1 ≤ n ≤ 100
   if not (1 <= n <= 100):
       return False
   # Verifică restricția 2: 1 ≤ i, j ≤ n pentru fiecare muchie
   for muchie in muchii:
       i, j = muchie
       if not (1 <= i <= n) or not (1 <= j <= n):
           return False
   return True

def elimina_muchiile_paritare(n, muchii):

   graf_partial = set()
   for muchie in muchii:
       i, j = muchie
       if i % 2 != j % 2:
           graf_partial.add(tuple(sorted(muchie)))
   return graf_partial

def main():

   # Citeste datele de intrare
   with open("graf_partialIN.txt", "r") as f:
       n = int(f.readline().strip())
       muchii = [list(map(int, line.strip().split())) for line in f]
   # Verifică restricțiile
   if not verificare_restricții(n, muchii):
       # Scrie mesajul în fișierul de ieșire
       with open("graf_partialOUT.txt", "w") as f:
           f.write("Datele nu corespund restrictiilor impuse\n")
       return
   # Elimina muchiile cu extremitati de aceeasi paritate
   graf_partial = elimina_muchiile_paritare(n, muchii)
   # Scrie doar numarul de muchii in fisierul de iesire
   with open("graf_partialOUT.txt", "w") as f:
       f.write(str(len(graf_partial)) + "\n")

if __name__ == "__main__":

   main()

</syntaxhighlight>