0544 - Partial

De la Universitas MediaWiki

Cerința

Se dă un graf neorientat conex cu n vârfuri și număr par de muchii. Să se determine un graf parțial al celui dat care să fie conex și să fie obținut prin eliminarea a jumătate din numărul de muchii.

Date de intrare

Fișierul de intrare partialIN.txt conține pe prima linie numărul n, iar pe a următoarele linii perechi de numere i j, cu semnificația că există muchie de la i la j.

Date de ieșire

Fișierul de ieșire partialOUT.txt va conține matricea de adiacență a grafului parțial obținut, câte o linie a matricei pe o linie a fișierului, elementele fiecărei linii fiind separate prin exact un spațiu.În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul "Datele nu corespund restrictiilor impuse".

Restricții și precizări

  • 1 ≤ n ≤ 200
  • 1 ≤ i,j ≤ n
  • se garantează existența unui graf parțial cu proprietatea cerută

Exemplul 1:

partialIN.txt

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

partialOUT.txt

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

Observații

  • 2016, iunie 02: am adăugat un test cu o situație care nu era cuprinsă în testele anterioare.

Exemplul 2:

partialIN.txt

201
1 2
1 3
1 4
1 5
1 6
2 4
2 5
3 4
3 5
4 5
4 6
5 6

partialOUT.txt

Datele nu corespund restrictiilor impuse

Rezolvare

nMAX = 200

def check_constraints(n, i, j):
    if not (1 <= n <= nMAX) or not (1 <= i <= n) or not (1 <= j <= n):
        with open("partialOUT.txt", "w") as fout:
            fout.write("Datele nu corespund restrictiilor impuse")
        return False
    return True

def dfs(n, gf, viz, viznod):
    def dfs_util(nod):
        viznod[nod] = True
        for j in range(1, n + 1):
            if gf[nod][j] and not viznod[j]:
                viz[nod][j] = viz[j][nod] = True
                dfs_util(j)

    dfs_util(1)

def process_input():
    n, m = 0, 0
    gf = [[False] * (nMAX + 1) for _ in range(nMAX + 1)]
    viz = [[False] * (nMAX + 1) for _ in range(nMAX + 1)]
    viznod = [False] * (nMAX + 1)

    with open("partialIN.txt", "r") as fin:
        n = int(fin.readline().strip())
        if not check_constraints(n, 1, 1):
            return

        for line in fin:
            a, b = map(int, line.split())
            if not check_constraints(n, a, b):
                return

            gf[a][b] = gf[b][a] = True
            m += 1

    dfs(n, gf, viz, viznod)

    mfol = 0
    for i in range(1, n + 1):
        for j in range(i + 1, n + 1):
            if mfol != m // 2 and gf[i][j] and not viz[i][j]:
                gf[i][j] = gf[j][i] = False
                mfol += 1

    with open("partialOUT.txt", "w") as fout:
        if check_constraints(n, 1, 1):
            for i in range(1, n + 1):
                fout.write(' '.join(map(str, [int(x) for x in gf[i][1:n + 1]])) + '\n')

if __name__ == "__main__":
    process_input()