Solução por Sofhia de Souza
Esse problema trata-se de um algoritmo básico de DFS. Basta contarmos a quantidade de vezes que chamamos a função e a quantidade de vezes que a retornamos, pois toda vez que chamamos a função (exceto a primeira vez), é como se Pedro fizesse um movimento indo de pra , e quando retornamos, é como se Pedro fizesse o movimento de volta de pra . Segue o código para melho entendimento:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//Desenhando Labirintos - URI 1076 | |
//Sofhia de Souza Gonçalves | |
#include <bits/stdc++.h> | |
#define pb push_back | |
using namespace std; | |
const int maxn = 55; | |
int t, n, v, a, vist[maxn], tempo; | |
vector < int > grafo[maxn]; | |
int dfs(int x) | |
{ | |
vist[x] = tempo; //marco x como visitado | |
int resp = 1; //comeco com 1, pois me movimento 1 para voltar pro pai no final | |
for(int v : grafo[x]) | |
{ | |
if(vist[v] == tempo) continue; //se ja visitei o vertice v nesse caso de teste, ignoro ele | |
resp += dfs(v) + 1; //do contrario, chamo a dfs dele e somo na resposta da subarvore de x a resposta da subarvore de v + 1 | |
} | |
return resp; //retorno a resposta de toda a subarvore de x | |
} | |
int main() | |
{ | |
cin >> t; //leio a quantidade de casos de teste | |
tempo = 1; //variavel que marca o caso de teste que estou | |
while(t--) | |
{ | |
cin >> n >> v >> a; | |
for(int i = 1 ; i <= a ; i++) | |
{ | |
int x, y; | |
cin >> x >> y; | |
grafo[x].pb(y); //coloco y na lista de adjacencias de x e vice-versa | |
grafo[y].pb(x); | |
} | |
cout << dfs(n) - 1 << "\n"; //imprimo o resultado chamando a dfs, -1 pois estava contado o movimento de chegar no primeiro | |
tempo++; //incremento a variavel que guarda o caso de teste, pois esse acabou | |
for(int i = 0 ; i < v ; i++) grafo[i].clear(); //limpo o grafo | |
} | |
} |