input <- c(
"a1=a2", "b1=b2", "b3=b2", "c1=c2", "e1=e2", "a3=a4", "c3=c4", "e1=e3",
"a2=a4", "c3=c1", "b3=a4", "c2=d1", "a4=a5", "d2=c1", "b4=b3", "d3=c3"
)
eq <- strsplit(input, "=")
id <- unique(unlist(eq))
n.id <- length(id)
A <- matrix(0, n.id, n.id)
rownames(A) <- colnames(A) <- id
E <- t(matrix(unlist(eq), 2))
A[E] <- A[E[, 2:1]] <- 1
group <- rep(0, n.id)
n.group <- 0
for (i in 1:n.id) {
if (group[i]) next
group[i] <- n.group <- n.group + 1
while (length(i)) {
j <- which(colSums(A[i, , drop = FALSE]) != 0)
i <- j[!group[j]]
group[i] <- n.group
}
}
for (i in 1:n.group) cat("[", toString(id[group == i]), "]\n", sep = "")
aW5wdXQgPC0gYygKICAgICJhMT1hMiIsICJiMT1iMiIsICJiMz1iMiIsICJjMT1jMiIsICJlMT1lMiIsICJhMz1hNCIsICJjMz1jNCIsICJlMT1lMyIsCiAgICAiYTI9YTQiLCAiYzM9YzEiLCAiYjM9YTQiLCAiYzI9ZDEiLCAiYTQ9YTUiLCAiZDI9YzEiLCAiYjQ9YjMiLCAiZDM9YzMiCikKCmVxIDwtIHN0cnNwbGl0KGlucHV0LCAiPSIpCmlkIDwtIHVuaXF1ZSh1bmxpc3QoZXEpKQpuLmlkIDwtIGxlbmd0aChpZCkKCkEgPC0gbWF0cml4KDAsIG4uaWQsIG4uaWQpCnJvd25hbWVzKEEpIDwtIGNvbG5hbWVzKEEpIDwtIGlkCkUgPC0gdChtYXRyaXgodW5saXN0KGVxKSwgMikpCkFbRV0gPC0gQVtFWywgMjoxXV0gPC0gMQoKZ3JvdXAgPC0gcmVwKDAsIG4uaWQpCm4uZ3JvdXAgPC0gMApmb3IgKGkgaW4gMTpuLmlkKSB7CiAgICBpZiAoZ3JvdXBbaV0pIG5leHQKICAgIGdyb3VwW2ldIDwtIG4uZ3JvdXAgPC0gbi5ncm91cCArIDEKICAgIHdoaWxlIChsZW5ndGgoaSkpIHsKICAgICAgICBqIDwtIHdoaWNoKGNvbFN1bXMoQVtpLCAsIGRyb3AgPSBGQUxTRV0pICE9IDApCiAgICAgICAgaSA8LSBqWyFncm91cFtqXV0KICAgICAgICBncm91cFtpXSA8LSBuLmdyb3VwCiAgICB9Cn0KCmZvciAoaSBpbiAxOm4uZ3JvdXApIGNhdCgiWyIsIHRvU3RyaW5nKGlkW2dyb3VwID09IGldKSwgIl1cbiIsIHNlcCA9ICIiKQ==
[a1, a2, b1, b2, b3, a3, a4, a5, b4]
[c1, c2, c3, c4, d1, d2, d3]
[e1, e2, e3]