tmp

扫码查看
#include<cstdio>
#include<algorithm>
using namespace std;
const int MAX = 3000+9;
inline int read() {
    char ch = getchar();int f = 1, x = 0;
    while(ch<'0' || ch>'9') {if(ch == '-') f = -1; ch = getchar();}
    while(ch>='0' && ch<='9') {x = (x<<1)+(x<<3)+ch-'0'; ch = getchar();}
    return x*f;
}

int n, m, k;
int val[MAX];

struct edge{
    int y, nxt, cost;
}e[MAX];
int cnt, head[MAX];
void add_edge(int x, int y, int cost) {
    e[++cnt].y = y;
    e[cnt].cost = cost;
    e[cnt].nxt = head[x];
    head[x] = cnt;
}

int size[MAX], f[MAX][MAX];

void dfs(int s) {
    size[s] = 1;
    for(int i = head[s]; i; i = e[i].nxt) {
        dfs(e[i].y);
        size[s] += size[e[i].y];
        for(int j = size[s]; j >= 0; j--) {
            for(int k = 1; k < j && k <= size[e[i].y]; k++) {
                f[i][j] = max(f[i][j], f[i][j-k]+f[e[i].y][k]-e[i].cost);
            }
        }
    }
}

int main() {
    n = read(), m = read();
    int a, c;
    for(int i = 1; i <= n-m; i++) {
        k = read();
        for(int j = 1; j <= k; j++) {
            a = read(), c = read();
            add_edge(i, a, c);
        }
        f[i][0] = 0;
    }
    for(int i = n-m+1; i <= n; i++) f[i][1] = read();
    dfs(1);
    int ans;
    for(ans = n; ans >= 1; ans--) if(f[1][ans] >= 0) break;
    printf("%d\n", ans);
    return 0;
}
01-18 15:08
查看更多