题目就是树上背包,但要先缩点为DAG
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | #include <iostream> #include <cstring> #include <vector> #include <stack> using namespace std ; const int N=503,M=1003; //#define int long long #define inf 1e9 int n,m,in[N],w[N],v[N]; int pool,low[N],dfn[N]; int cl,col[N]; int W[N],VAL[N]; int f[N][M]; vector< int > g[N],graph[N]; stack< int > st; void tarjan( int x){ st.push(x); dfn[x]=low[x]=++pool; int i,y; for (i=0;i<g[x].size();i++){ y=g[x][i]; if (!dfn[y]) tarjan(y),low[x]=min(low[x],low[y]); else if (!col[y]) low[x]=min(low[x],dfn[y]); } if (dfn[x]==low[x]){ cl++; do { y=st.top(); st.pop(); col[y]=cl; } while (x!=y); } } void dp( int x){ for ( int i=0;i<=m;i++){ if (i>=W[x]) f[x][i]= VAL[x]; else f[x][i]= -inf; } int j,k; for ( int i=0,y;i<graph[x].size();i++){ y=graph[x][i]; dp(y); for (j=m;j>=0;j--) for (k=0;k<=j;k++) f[x][j]=max(f[x][j], f[x][j-k]+f[y][k]); } } signed main(){ int i,j,x,y; cin>>n>>m; for (i=1;i<=n;i++) cin>>w[i]; for (i=1;i<=n;i++) cin>>v[i]; for (i=1;i<=n;i++){ cin>>y; if (y) g[y].push_back(i); } for (i=1;i<=n;i++) if (!dfn[i]) tarjan(i); for (i=1;i<=n;i++) W[col[i]]+=w[i],VAL[col[i]]+=v[i]; for (i=1;i<=n;i++) for (j=0;j<g[i].size();j++){ x=col[i],y=col[g[i][j]]; if (x!=y){ in[y]++; graph[x].push_back(y); } } for (i=1;i<=cl;i++) if (in[i]==0) graph[0].push_back(i); dp(0); cout<<f[0][m]; } |
分类:
图论
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!