Esse é um problema que pode ser resolvido com grafos.
Vamos considerar cada ligação entre dois animais como uma aresta, e cada animal um vértice. A partir disso é possível ver que cada componente conexo é uma espécie, então reduzimos o problema a contar o número de componentes conexos nesse grafo.
Isso pode ser feito com uma simples DFS que marca todos os elementos que fazem parte de um componete conexo, e conforme passamos pelos vértices, marcamos todos que estão no mesmo componente que ele. Caso um vértice não tenha sido marcado, adicionamos 1 a contagem de componentes.
Código para melhor entendimento:
https://gist.github.com/fredbr/535e0028f0fc1e12a66d071d37d8b55d
