4067 - CcMax

From Bitnami MediaWiki

Cerinţa[edit | edit source]

Se dă un graf neorientat cu n vârfuri. Determinați numărul maxim de vârfuri dintr-o componentă conexă și numărul de componente conexe care au acest număr maxim de vârfuri.

Date de intrare[edit | edit source]

Fişierul de intrare ccmaxIN.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[edit | edit source]

Fişierul de ieşire ccmaxOUT.txt va conţine pe prima linie numărul maxim de vârfuri dintr-o componentă conexă și numărul de componente conexe care au acest numar maxim de vârfuri, separate prin exact un spațiu.

Restricţii şi precizări[edit | edit source]

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

Exemplul 1[edit | edit source]

ccmaxIN.txt

7
1 5 
3 5
2 4
6 4

ccmaxOUT.txt

3 2

Explicație:[edit | edit source]

Graful conține două componente cu număr maxim de vârfuri, fiecare având câte 3 vârfuri. Acestea sunt {1,3,5} și {2,4,6}, iar vârful 7 este izolat.

Exemplul 2[edit | edit source]

ccmaxIN.txt

101

ccmaxOUT.txt

Datele nu corespund restrictiilor impuse

Rezolvare[edit | edit source]

<syntaxhighlight lang="python3" line="1"> def parcurgere_dfs(nod, vizitat, graf):

   vizitat[nod] = True
   dimensiune = 1
   for vecin in graf[nod]:
       if not vizitat[vecin]:
           dimensiune += parcurgere_dfs(vecin, vizitat, graf)
   return dimensiune

def verificare_restrictii(n, muchii):

   if not (1 <= n <= 100):
       return False
   for i, j in muchii:
       if not (1 <= i <= n) or not (1 <= j <= n):
           return False
   return True

def main():

   with open("ccmaxIN.txt", "r") as infile:
       n = int(infile.readline().strip())
       muchii = [tuple(map(int, linie.split())) for linie in infile]
       if not verificare_restrictii(n, muchii):
           with open("ccmaxOUT.txt", "w") as outfile:
               outfile.write("Datele nu corespund restrictiilor impuse\n")
           return
       graf = {i: [] for i in range(1, n + 1)}
       for i, j in muchii:
           graf[i].append(j)
           graf[j].append(i)
   dim_maxima = 0
   numar_dim_maxima = 0
   vizitat = [False] * (n + 1)
   for nod in range(1, n + 1):
       if not vizitat[nod]:
           dimensiune_componenta = parcurgere_dfs(nod, vizitat, graf)
           if dimensiune_componenta > dim_maxima:
               dim_maxima = dimensiune_componenta
               numar_dim_maxima = 1
           elif dimensiune_componenta == dim_maxima:
               numar_dim_maxima += 1
   with open("ccmaxOUT.txt", "w") as outfile:
       if dim_maxima == 0:
           outfile.write("Datele nu corespund restrictiilor impuse\n")
       else:
           outfile.write(f"{dim_maxima} {numar_dim_maxima}\n")

if __name__ == "__main__":

   main()

</syntaxhighlight>