为啥建单向边可过,建双向边就wa了捏(用st[]判断不能回搜了)
#include<bits/stdc++.h>
using namespace std;
int n,m;
int h[514],e[1145],ne[1145],idx;
int st[514];
int f[1145][1145];
inline void add(int a,int b)
{
idx++;
ne[idx]=h[a];
e[idx]=b;
h[a]=idx;
}
inline void dfs(int x)
{
st[x]=x;
for(int i=h[x];i;i=ne[i])
{
int y=e[i];
if(!st[y])
{
dfs(y);
for(int j=m+1;j>=1;j--)
for(int k=0;k<j;k++)
f[x][j]=max(f[x][j],f[y][k]+f[x][j-k]);
}
}
}
int main()
{
cin>>n>>m;
f[0][1]=0;
for(int i=1;i<=n;i++)
{
int b;
cin>>b>>f[i][1];
//add(i,b);
add(b,i);
}
dfs(0);
/*for(int i=1;i<=n;i++)
cout<<f[i][1]<<' ';*/
/*for(int i=0;i<=n;i++)
{
for(int j=1;j<=m+1;j++)
cout<<f[i][j]<<' ';
cout<<endl;
}*/
cout<<f[0][m+1];
return 0;
}