//clumsy code for Vincent's dynprog idea #include #include #include #include #include #include using namespace std; #define NMAX 100000 int** maxsum; struct Edge {int v1, v2;}; typedef struct Edge Edge; vector adj[NMAX]; vector children[NMAX]; int q[NMAX]; int seen[NMAX]; int N,P; void solve(int k) { for (int i = 0; i=0; i--) { int crt = q[i]; for (int b = 0; b<=k; ++b) { maxsum[crt][b] = 0; if (2*b<=k) { //cas 1 for (Edge childedge: children[crt]) { int child = childedge.v1+childedge.v2-crt; int maxperchild = 0; for (int w = 0; w<=b; ++w) if (maxsum[child][b-w]+w > maxperchild) maxperchild = maxsum[child][b-w]+w; maxsum[crt][b]+=maxperchild; } } else { //start from here if (b>=1) maxsum[crt][b]=maxsum[crt][b-1]; for (int w = k/2+1; w<=b; ++w) { // for each possible weight w; for (Edge childedge: children[crt]) { //for each "main child" int thissum = 0; int mainchild = childedge.v1+childedge.v2-crt; for (Edge childedge2: children[crt]) { int child = childedge2.v1+childedge2.v2-crt; int maxperchild = 0; int maxquant = (child == mainchild)? w:k-w; for (int wi = 0; wi<=maxquant; wi++) if (maxsum[child][maxquant-wi] + wi > maxperchild) maxperchild = maxsum[child][maxquant-wi] + wi; thissum +=maxperchild; } if (thissum>maxsum[crt][b]) maxsum[crt][b] = thissum; } } } } } //phew } int main() { int x, y; scanf("%d %d", &N, &P); maxsum = new int*[N]; for (int i = 0; i= P) break; k*=2; } //now do dichotomy: first = k/2; last = k; while (first<=last) { int mid = (first+last)/2; solve(mid); int max = maxsum[root][mid];; if (max