0420 - Graf Partial

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

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