node dfs(int u) { node res(1,a[u]); e[u] = true; for (edge i = g.getHead(u); i; i = i->next) { int v = i->to; if (e[v]) continue; node tmp = dfs(v); res.first += tmp.first; res.second += tmp.second; } return res; }
void bfs() { queue<int> q; rep(i, 1, n+1) if (d[i] <= 1) q.push(i); while (!q.empty()) { int u = q.front(); q.pop(); if (e[u]) continue; e[u] = true; if (d[u] != 1) continue; for (edge i = g.getHead(u); i; i = i->next) { int v = i->to; if (e[v]) continue; if ((--d[v]) == 1) q.push(v); } } }