0473 - Bipartit Complet

De la Universitas MediaWiki
Versiunea pentru tipărire nu mai este suportată și poate avea erori de randare. Vă rugăm să vă actualizați bookmarkurile browserului și să folosiți funcția implicită de tipărire a browserului.

Cerinţa

Se consideră două mulţimi nevide A şi B, cu proprietatea că formează o partiție a mulțimii {1,2,...,n}. Să se construiască un graf bipartit complet cu n vârfuri, bipartit peste partiţia formată din mulțimile A și B.

Date de intrare

Fişierul de intrare bipartitcompletIN.txt conţine pe prima linie numărul n. Urmează un număr k, apoi k numere naturale distincte cuprinse între 1 și n, reprezentând vârfurile din A. Mulțimea B conține toate numerele naturale cuprinse între 1 și n care nu sunt în A.

Date de ieşire

Fişierul de ieşire bipartitcompletOUT.txt va conţine matricea de adiacență a grafului construit, câte o linie a matricei pe o linie a fișierului, elementele de pe o linie fiind separate prin exact un spațiu.În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul "Nu corespunde restricțiilor impuse".

Restricţii şi precizări

  • 1 < k < n ≤ 100

Exemplul 1:

bipartitcompletIN.txt

7
3 
4 6 3

bipartitcompletOUT.txt

0 0 1 1 0 1 0 
0 0 1 1 0 1 0 
1 1 0 0 1 0 1 
1 1 0 0 1 0 1 
0 0 1 1 0 1 0 
1 1 0 0 1 0 1 
0 0 1 1 0 1 0 

Exemplul 2 :

bipartitcompletIN.txt

1001
3 
4 6 3

bipartitcompletOUT.txt

Datele nu corespund restrictiilor impuse

Rezolvare

def verifica_restrictii(k, n):
    if not (1 < k < n <= 100):
        with open("bipartitcompletOUT.txt", 'w') as f:
            f.write("Datele nu corespund restrictiilor impuse")
        return False
    return True

def construieste_graf(n, A):
    # Inițializăm matricea de adiacență cu zerouri
    graf = [[0] * n for _ in range(n)]

    # Marcam conexiunile dintre vârfurile din A și B
    for i in A:
        for j in range(1, n + 1):
            if j not in A:
                graf[i - 1][j - 1] = 1
                graf[j - 1][i - 1] = 1  # Adăugăm și conexiunea inversă

    return graf

def scrie_matrice_in_fisier(matrice, nume_fisier):
    with open(nume_fisier, 'w') as f:
        for linie in matrice:
            f.write(' '.join(map(str, linie)) + '\n')

if __name__ == "__main__":
    # Citim datele de intrare din fișier
    with open("bipartitcompletIN.txt", 'r') as f:
        n = int(f.readline().strip())
        k = int(f.readline().strip())
        A = list(map(int, f.readline().strip().split()))

    # Verificăm restricțiile
    if not verifica_restrictii(k, n):
        exit()

    # Construim graful bipartit
    graf = construieste_graf(n, A)

    # Scriem matricea de adiacență în fișierul de ieșire
    scrie_matrice_in_fisier(graf, "bipartitcompletOUT.txt")