Rete idrica (tubature)

Ciao a tutti,
sto tentando di risolvere rete idrica, ma tutti i miei tentativi mi hanno portato solo ad un misero 25/100 con almeno un caso errato dal terzo subtask in poi. La mia idea è di percorrere l’albero dal fondo tenendomi il numero minimo di guardie per ogni nodo, tuttavia non sembra avere molto successo. Qualcuno può darmi un aiutino?

#include <forward_list>
#include <queue>
#define MAXN 100000

using namespace std;

int citta[MAXN];
int guardie[MAXN];
forward_list<int> ordine;
forward_list<int> grafo[MAXN];

int pianifica(int N, int M, int da[], int a[], int C[], int G[])
{
    int root = N-1;
    for(int i=0; i!=N-1; i++)
    {
        grafo[da[i]].emplace_front(a[i]);
        root ^= a[i]^i;
    }
    for(int i=0; i!=M; i++)
        citta[C[i]]++;

    queue<int> coda; coda.emplace(root);
    while(!coda.empty())
    {
        int now = coda.front();
        coda.pop();
        ordine.emplace_front(now);

        for(int i : grafo[now])
            coda.emplace(i);
    }

    for(int i : ordine)
    {
        if(grafo[i].empty())
        {
            guardie[i] = G[i];
            continue;
        }
        for(int j : grafo[i])
        {
            citta[i] += citta[j];
            if(citta[j]) guardie[i] += guardie[j];
        }
        guardie[i] = min(guardie[i],G[i]);
    }

    return guardie[root];
}

Grazie in anticipo.