4304 - FF

De la Universitas MediaWiki

Cerința

Se dă un graf neorientat. Să se determine un subgraf al său, cu număr cât mai mare de noduri și în care fiecare nod are gradul cel puțin 2.

Date de intrare

Fișierul de intrare ffIN.txt conține pe prima linie numerele n și m reprezentând numărul de noduri și numărul de muchii pentru graful dat. Fiecare din următoarele m linii conține două numere, x și y, semnificând existența în graful dat a unei muchii între nodurile x și y.

Date de ieșire

Fișierul de ieșire ffOUT.txt va conține valoarea ce reprezintă numărul maxim de noduri pe care le poate avea subgraful determinat.Î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 ≤ 100.000
  • 1 ≤ m ≤ 200.000
  • Se garantează existența unui astfel de subgraf.

Exemplul 1:

ffIN.txt

4 4
1 2
4 1
2 3
1 3

ffOUT.txt

3

Exemplul 2:

ffIN.txt

123921321 4
1 2
4 1
2 3
1 3

ffOUT.txt

Datele nu corespund restrictiilor impuse

Rezolvare

from collections import deque

Inf = 0x3f3f3f3f

def check_restrictions(n, m):
    if not (1 <= n <= 100000 and 1 <= m <= 200000):
        with open("ffOUT.txt", "w") as outfile:
            outfile.write("Datele nu corespund restrictiilor impuse")
        return True
    return False

def main():
    with open("ffIN.txt", "r") as infile, open("ffOUT.txt", "w") as outfile:
        n, m = map(int, infile.readline().split())
        
        if check_restrictions(n, m):
            return
        
        G = [[] for _ in range(n + 1)]
        g = [0] * (n + 1)
        f = [0] * (n + 1)
        scad = 0

        for _ in range(m):
            x, y = map(int, infile.readline().split())
            G[x].append(y)
            G[y].append(x)
            g[x] += 1
            g[y] += 1

        q = deque()
        for i in range(1, n + 1):
            if g[i] == 1:
                q.append(i)
                g[i] = 0
                f[i] = 1
            elif g[i] == 0:
                scad += 1

        while q:
            x = q.popleft()
            scad += 1
            for i in G[x]:
                g[i] -= 1

                if g[i] < 2 and f[i] == 0:
                    q.append(i)
                    f[i] = 1

        outfile.write(str(n - scad))

if __name__ == "__main__":
    main()