Solução Intermediário Informática - Semana 38

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:


#include <bit/stdc++.h>
using namespace std;
const int maxn = 100010;
vector<int> v[maxn];
int vis[maxn];
void dfs(int x)
{
vis[x] = 1;
for (int u : v[x]) if (!vis[u]) dfs(u);
}
int main()
{
int n, m;
cin >> n >> m;
for (int i = 0; i < m; i++) {
int a, b;
cin >> a >> b;
v[a].push_back(b);
v[b].push_back(a);
}
int ans = 0;
for (int i = 1; i <= n; i++) if (!vis[i]) dfs(i), ans++;
cout << ans << "\n";
}

view raw

natalia.cpp

hosted with ❤ by GitHub