Imaginary Grasshopper 65/100

Stavo risolvendo questo problema ma mi va in TLE in alcuni casi del Subtask 5, questo e’ il codice:

#include <bits/stdc++.h>
#define ve vector
#define pb push_back
using namespace std;

int n, m;
int ans;

void visita(int node, ve<ve<int>> &adj, ve<bool> &s_uno, ve<bool> &visto) {
	if(visto[node]) return;
	visto[node] = 1;
	++ans;

	for(auto child : adj[node]) {
        if(s_uno[node]) {
            visita(child, adj, s_uno, visto);
        }
		for(auto child2 : adj[child]) {
			visita(child2, adj, s_uno, visto);
		}

	}

}

int main() {
    ifstream cin("input.txt");
    ofstream cout("output.txt");
    
	cin >> n >> m;
	ve<ve<int>> adj(n);
	ve<bool> s_uno(n, 0), visto(n, 0);
	
	for(int i = 0; i < m; ++i) {
		int a, b;
		cin >> a >> b;
		if(a == b) s_uno[a] = true;
		adj[a].pb(b);
	}

	visita(0, adj, s_uno, visto);
	cout << ans;

	return 0;
}

Poiché iteri su tutti i vicini di tutti i vicini, questa soluzione è O(M^2) e non può chiaramente risolvere casi con M=10^6.
Questo problema è uno dei tanti risolvibili moltiplicando il grafo, cioè creare un altro grafo su cui poi applicare un algoritmo “standard”. Prova a pensare a come potresti risolvere questo problema sdoppiando ogni nodo.