0420 - Graf Partial

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

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

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

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

Exemplul 1

graf_partialIN.txt

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

graf_partialOUT.txt

3

Explicație

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

graf_partialIN.txt

1000

graf_partialOUT.txt

Datele nu corespund restrictiilor impuse

Rezolvare

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