1 solutions

  • 0
    @ 2025-11-5 17:27:59

    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