Вы получаете неправильный ответ, потому что вы неправильно рассчитываете счет. Для соединения n
узлов в дерево требуется n-1
ребер, и num_clusters-1
из них должны быть красного цвета.
Но если вы это исправите, ваша программа все равно будет очень медленной из-за Ваша реализация дизъюнктных множеств.
К счастью, довольно легко реализовать очень эффективную структуру данных непересекающихся множеств в одном массиве / списке / векторе практически на любом языке программирования. Вот хороший в python. На моем ящике python 2, поэтому мои операторы печати и ввода немного отличаются от ваших:
# Create a disjoint set data structure, with n singletons, numbered 0 to n-1
# This is a simple array where for each item x:
# x > 0 => a set of size x, and x <= 0 => a link to -x
def ds_create(n):
return [1]*n
# Find the current root set for original singleton index
def ds_find(ds, index):
val = ds[index]
if (val > 0):
return index
root = ds_find(-val)
if (val != -root):
ds[index] = -root # path compression
return root
# Merge given sets. returns False if they were already merged
def ds_union(ds, a, b):
aroot = ds_find(ds, a)
broot = ds_find(ds, b)
if aroot == broot:
return False
# union by size
if ds[aroot] >= ds[broot]:
ds[aroot] += ds[broot]
ds[broot] = -aroot
else:
ds[broot] += ds[aroot]
ds[aroot] = -broot
return True
# Count root sets
def ds_countRoots(ds):
return sum(1 for v in ds if v > 0)
#
# CherriesMesh solution
#
numTests = int(raw_input())
for testNum in range(1,numTests+1):
numNodes, numEdges = map(int,raw_input().split())
sets = ds_create(numNodes)
for _ in range(numEdges):
a,b = map(int,raw_input().split())
print a,b
ds_union(sets, a-1, b-1)
count = numNodes + ds_countRoots(sets) - 2
print 'Case #{0}: {1}'.format(testNum, count)