3364 - Unire
Cerința[edit | edit source]
Gigel are un graf cu n
noduri și m
muchii, care nu este conex. El dorește să afle răspunsul la două întrebări:
1) Care este numărul minim de muchii ce trebuie ađugate astfel încât graful să devină conex?
2) Dacă costul adăugării unei muchii între nodurile a
și b
este a + b
, care este costul total minim al muchiilor care trebuie adăugate astfel încât graful să devină conex?
Date de intrare[edit | edit source]
Fișierul de intrare unireIN.txt
conține pe prima linie numerele n
și m
, pe a doua linie conține numărul c
, reprezentând numărul cerinței 1 ≤ c ≤ 2
, iar pe următoarele m
linii se află muchiile grafului a b
, 1 ≤ a, b ≤ n
, a ≠ b
.
Date de ieșire[edit | edit source]
Fișierul de ieșire unireOUT.txt
va conține pe prima linie numărul S
, reprezentând răspunsul cerut de Gigel.În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul "Datele nu corespund restrictiilor impuse".
Restricții și precizări[edit | edit source]
1 ≤ n ≤ 100000
,0 ≤ m < n-1
- Pentru teste în valoare de
30
de puncte, cerința va fi1
. - Pentru teste în valoare de
40
de puncte,1 ≤ n ≤ 1000
.
Exemplul 1:[edit | edit source]
unireIN.txt
6 3 1 1 2 3 4 5 6
unireOUT.txt
2
Exemplul 2:[edit | edit source]
unireIN.txt
1000001 3 1 1 2 3 4 5 6
unireOUT.txt
Datele nu corespund restrictiilor impuse
Rezolvare[edit | edit source]
<syntaxhighlight lang="python3" line="1"> def check_restrictions(n, m):
return not (1 <= n <= 100000 and 0 <= m < n - 1)
def dfs(v, c, C, G):
C[v] = c for i in G[v]: if not C[i]: dfs(i, c, C, G)
def main():
with open("unireIN.txt", "r") as input_file, open("unireOUT.txt", "w") as output_file: n, m = map(int, input_file.readline().split())
if check_restrictions(n, m): output_file.write("Datele nu corespund restrictiilor impuse\n") return
c = int(input_file.readline().strip())
G = [[] for _ in range(100001)] C = [0] * 100001 nc = 0 f = [0] * 100001 s = 0
for _ in range(m): x, y = map(int, input_file.readline().split()) G[x].append(y) G[y].append(x)
for i in range(1, n + 1): if not C[i]: nc += 1 dfs(i, i, C, G)
if c == 1: output_file.write(str(nc - 1) + "\n") else: C.sort() for i in range(2, n + 1): if C[1] != C[i] and f[C[i]] == 0: s += (C[1] + C[i]) f[C[i]] += 1
output_file.write(str(s) + "\n")
if __name__ == "__main__":
main()
</syntaxhighlight>