分析:
一开始我以为是裸的树形背包...之后被告知这东西...可能有环...什么!有环!
有环就搞掉就就可以了...tarjan缩点...建图记得建立从i到d[i]之后跑tarjan,因为这样才能判断出环的情况...
缩点之后重新建图就需要见d[i]到i了...
附上代码:
#include#include #include #include #include #include #include using namespace std;#define N 205struct node{ int to,next;}e[N];int f[N][505],head[N],cnt,dfn[N],low[N],vis[N],sta[N],top,tims,fa[N],n,m,a[N],b[N],in1[N];void add(int x,int y){if(!y)return;e[cnt]=(node){y,head[x]};head[x]=cnt++;}void tarjan(int x){ dfn[x]=low[x]=++tims;sta[++top]=x;vis[x]=1; for(int i=head[x];i!=-1;i=e[i].next) { int to1=e[i].to; if(vis[to1])low[x]=min(dfn[to1],low[x]); else if(!dfn[to1])tarjan(to1),low[x]=min(low[x],low[to1]); } if(dfn[x]==low[x]) { while(sta[top]!=x) { fa[sta[top]]=x; vis[sta[top]]=0; top--; } fa[x]=x;vis[x]=0;top--; }}vector v[N];void dfs(int x){ for(int i=0;i =b[x];i--)f[x][i]=f[x][i-b[x]]+a[x]; for(int i=0;i