# Dados Sintéticos de 5 Servidores: (Uso_CPU_%, Uso_RAM_%)
servidores = {
    "Servidor_1": (15, 20),
    "Servidor_2": (18, 22),
    "Servidor_3": (85, 90),
    "Servidor_4": (88, 95),
    "Servidor_5": (50, 50)
}

def distancia_euclidiana(p1, p2):
    return ((p1[0] - p2[0])**2 + (p1[1] - p2[1])**2)**0.5

print("=== SIMULAÇÃO DE DENDOGRAMA HIERÁRQUICO (AGLOMERATIVO) ===")
# Inicialmente, cada servidor é o seu próprio grupo
clusters_atuais = {nome: [coord] for nome, coord in servidores.items()}

paso = 1
while len(clusters_atuais) > 1:
    menor_dist = float('inf')
    par_para_fundir = None
    
    nomes = list(clusters_atuais.keys())
    # Encontra os dois clusters com menor distância média
    for i in range(len(nomes)):
        for j in range(i + 1, len(nomes)):
            nome1, nome2 = nomes[i], nomes[j]
            p1 = clusters_atuais[nome1][0]
            p2 = clusters_atuais[nome2][0]
            dist = distancia_euclidiana(p1, p2)
            
            if dist < menor_dist:
                menor_dist = dist
                par_para_fundir = (nome1, nome2)
                
    # Fusão dos dois clusters mais próximos
    c1, c2 = par_para_fundir
    novo_nome = f"({c1} + {c2})"
    novo_ponto = (
        (clusters_atuais[c1][0][0] + clusters_atuais[c2][0][0]) / 2,
        (clusters_atuais[c1][0][1] + clusters_atuais[c2][0][1]) / 2
    )
    
    print(f"Passo {paso}: Fundindo {c1} e {c2} | Distância de Junção = {menor_dist:.2f}")
    
    del clusters_atuais[c1]
    del clusters_atuais[c2]
    clusters_atuais[novo_nome] = [novo_ponto]
    paso += 1

print("\nAgrupamento Hierárquico Completo!")