3508 - Bal: Difference between revisions
Pagină nouă: == Cerinta == La balul din acest an participă n băieți și n fete, numerotați de la 1 la n. Compatibilitățile dintre aceștia pot fi reprezentate sub forma unui graf bipartit. Fie mat matricea de adiacentă. Atunci, băiatul i se poate cupla cu fata j doar dacă sunt compatibili, adică mat[i][j] = 1. Aflați numărul de moduri de a forma cele n cupluri. == Date de intrare == Programul citește de la tastatură numărul n, iar apoi matricea de adiacență. == Date d... |
No edit summary |
||
Line 1: | Line 1: | ||
== Cerinta == | == Cerinta == | ||
La balul din acest an participă n băieți și n fete, numerotați de la 1 la n. Compatibilitățile dintre aceștia pot fi reprezentate sub forma unui graf bipartit. Fie mat matricea de adiacentă. Atunci, băiatul i se poate cupla cu fata j doar dacă sunt compatibili, adică mat[i][j] = 1. Aflați numărul de moduri de a forma cele n cupluri. | La balul din acest an participă '''n''' băieți și '''n''' fete, numerotați de la 1 la n. Compatibilitățile dintre aceștia pot fi reprezentate sub forma unui graf bipartit. Fie mat matricea de adiacentă. Atunci, băiatul '''i''' se poate cupla cu fata '''j''' doar dacă sunt compatibili, adică '''mat[i][j] = 1'''. Aflați numărul de moduri de a forma cele '''n''' cupluri. | ||
== Date de intrare == | == Date de intrare == | ||
Programul citește de la tastatură numărul n, iar apoi matricea de adiacență. | Programul citește de la tastatură numărul '''n''', iar apoi matricea de adiacență. | ||
== Date de iesire == | == Date de iesire == | ||
Programul va afișa pe ecran numărul de moduri de a forma cuplurile, modulo 1.000.000.007. | Programul va afișa pe ecran numărul de moduri de a forma cuplurile, modulo '''1.000.000.007'''. | ||
== Restrictii si precizari == | == Restrictii si precizari == | ||
Line 22: | Line 22: | ||
:1 1 1 | :1 1 1 | ||
;Iesire | ;Iesire | ||
:Datele introduse corespund restrictiilor impuse | |||
:3 | :3 | ||
Line 32: | Line 32: | ||
:0 0 -1 | :0 0 -1 | ||
;Iesire | ;Iesire | ||
:Datele introduse nu corespund restrictiilor impuse | |||
Revision as of 10:08, 27 December 2023
Cerinta
La balul din acest an participă n băieți și n fete, numerotați de la 1 la n. Compatibilitățile dintre aceștia pot fi reprezentate sub forma unui graf bipartit. Fie mat matricea de adiacentă. Atunci, băiatul i se poate cupla cu fata j doar dacă sunt compatibili, adică mat[i][j] = 1. Aflați numărul de moduri de a forma cele n cupluri.
Date de intrare
Programul citește de la tastatură numărul n, iar apoi matricea de adiacență.
Date de iesire
Programul va afișa pe ecran numărul de moduri de a forma cuplurile, modulo 1.000.000.007.
Restrictii si precizari
- 1 < n < 25
Exemplul 1
- Intrare
- 3
- 0 1 1
- 1 0 1
- 1 1 1
- Iesire
- Datele introduse corespund restrictiilor impuse
- 3
Exemplul 2
- Intrare
- 3
- -5 34 0
- 3 87 0
- 0 0 -1
- Iesire
- Datele introduse nu corespund restrictiilor impuse
Rezolvare
<syntaxhighlight lang="python3" line="1"> def numara_cupluri(mat, n):
MOD = 1000000007
def dfs(baiat, vazut): vazut[baiat] = True for fata in range(n): if mat[baiat][fata] and not vazut[n + fata]: vazut[n + fata] = True
if perechi[n + fata] == -1 or dfs(perechi[n + fata], vazut): perechi[n + fata] = baiat return True
return False
perechi = [-1] * (2 * n) rezultat = 0
for baiat in range(n): vazut = [False] * (2 * n) if dfs(baiat, vazut): rezultat += 1
return rezultat % MOD
- Citire număr de băieți/fete și matricea de adiacență
n = int(input("Introduceți numărul n: ")) matrice_adiacenta = [list(map(int, input().split())) for _ in range(n)]
- Calcul și afișare rezultat
rezultat = numara_cupluri(matrice_adiacenta, n) print(rezultat) </syntaxhighlight>
Explicatie
Cele 3 modalități sunt:
- (1, 2), (2, 1), (3, 3)
- (1, 2), (2, 3), (3, 1)
- (1, 3), (2, 1), (3, 2)