1 solutions
-
0
C++ :
#define MAX(A,B) ((A)>(B)?(A):(B)) #define MIN(A,B) ((A)<(B)?(A):(B)) #define MAXN 110 #include<cstdio> #include<cstring> using namespace std; int n, m, t, num, head, cnt, dnf[MAXN], low[MAXN], d[MAXN], w[MAXN], v[MAXN], ru[MAXN], sta[MAXN], bg[MAXN], wt[MAXN], my[MAXN], ch[MAXN][2], f[MAXN][510]; bool ins[MAXN], vis[MAXN]; struct me { int qian, hou, nt; }sg[MAXN]; void ADD(int x,int y) { sg[++t].hou = y; sg[t].qian = x; sg[t].nt = d[x]; d[x] = t; } void TARJAN(int x) { vis[x] = true; low[x] = dnf[x] = ++num; sta[++head] = x; ins[x] = true; for(int i = d[x] ; i != -1 ; i = sg[i].nt) { if(!vis[sg[i].hou]) { TARJAN(sg[i].hou); low[x] = MIN(low[x], low[sg[i].hou]); } else { if(ins[sg[i].hou]) { low[x] = MIN(low[x], dnf[sg[i].hou]); } } } if(low[x] == dnf[x]) { int op; ++cnt; do { op = sta[head--]; //printf("%d belong to -> %d\n", op, cnt); ins[op] = false; bg[op] = cnt; } while(op!=x); } return; } void DP(int x,int k) { if(!x&&k) { return; } DP(ch[x][1], k+1); DP(ch[x][0], k+1); if(m>wt[x]) { for(int i = 1 ; i < wt[x] ; ++ i) { f[x][i] = f[ch[x][1]][i]; } f[x][wt[x]] = MAX(my[x], f[ch[x][1]][wt[x]]); for(int i = wt[x]+1 ; i <= m ; ++ i) { f[x][i] = MAX(f[x][i-1], f[ch[x][1]][i]); for(int j = 0 ; j <= i-wt[x] ; ++ j) { f[x][i] = MAX(f[x][i], f[ch[x][0]][j]+f[ch[x][1]][i-wt[x]-j]+my[x]); } // printf("f[%d][%d] = %d\n", x, i, f[x][i]); } } else { for(int i = 1 ; i <= m ; ++ i) { f[x][i] = f[ch[x][1]][i]; } if(m==wt[x]) { f[x][m] = MAX(f[x][m], my[x]); } } } int main() { int x; memset(d, -1, sizeof(d)); scanf("%d%d", &n, &m); for(int i = 1 ; i <= n ; ++ i) { scanf("%d", &w[i]); } for(int i = 1 ; i <= n ; ++ i) { scanf("%d", &v[i]); } for(int i = 1 ; i <= n ; ++ i) { scanf("%d", &x); if(x) { ADD( x, i); } } for(int i = 1 ; i <= n ; ++ i) { if(!vis[i]) { TARJAN(i); } } for(int i = 1 ; i <= n ; ++ i) { my[bg[i]] += v[i]; wt[bg[i]] += w[i]; } int nu = 0; for(int i = 1 ; i <= t ; ++ i) { if(bg[sg[i].qian]!=bg[sg[i].hou]) { ++nu; ++ru[bg[sg[i].hou]]; if(ch[bg[sg[i].qian]][0]) { int q = ch[bg[sg[i].qian]][0], p; while(q) { p = q; q = ch[q][1]; } ch[p][1] = bg[sg[i].hou]; } else { ch[bg[sg[i].qian]][0] = bg[sg[i].hou]; } } } for(int i = 1 ; i <= cnt ; ++ i) { if(!ru[i]) { ++nu; if(!ch[0][0]) { ch[0][0] = i; } else { int q= ch[0][0], p; while(q) { p = q;; q = ch[q][1]; } ch[p][1] = i; } } } DP(0,0); printf("%d", f[ch[0][0]][m]); getchar(); getchar(); return 0; }
- 1
Information
- ID
- 18458
- Time
- 1000ms
- Memory
- 128MiB
- Difficulty
- (None)
- Tags
- # Submissions
- 0
- Accepted
- 0
- Uploaded By