萌新求助
查看原帖
萌新求助
313856
_Purslane_楼主2021/8/17 10:21

RT , 把树变成了DFS序 , 然后正着做错了 , 反着做却对了 ? 为什么 ?

#include<bits/stdc++.h>
using namespace std;
inline bool id(const char ch) {
	return ch>='0'&&ch<='9';
}
inline int read(void) {
	int s=0,f=0;
	char ch=getchar();
	while(!id(ch)) f=(ch=='-'),ch=getchar();
	while(id(ch)) s=(s<<1)+(s<<3)+(ch^48),ch=getchar();
	return f?-s:s;
}
const int MAXN=300+10,MAXM=300+10;
struct Edge {
	int to,nxt;	
}edge[MAXN<<2];
int n,m,hd[MAXN],dfn[MAXN],dfns=-1,v[MAXN],tot,dp[MAXN][MAXN],sz[MAXN];
inline void add_edge(const int x,const int y) {
	edge[++tot]=Edge{y,hd[x]},hd[x]=tot;
	edge[++tot]=Edge{x,hd[y]},hd[y]=tot;
	return;	
}
inline void dfs(const int u,const int f) {
	dfn[++dfns]=u,sz[u]=1;
	for(int i=hd[u];i;i=edge[i].nxt) {
		int to=edge[i].to;
		if(to==f) continue;
		dfs(to,u);
		sz[u]+=sz[to];
	}	
	return;
}
int main() {
	n=read(),m=read();
	for(int i=1,u;i<=n;i++) u=read(),v[i]=read(),add_edge(i,u);
	dfs(0,0);
	for(int i=0;i<=n;i++) for(int j=0;j<=n;j++) dp[i+1][j+1]=max(dp[i+1][j+1],dp[i][j]+v[dfn[i]]),dp[i+sz[dfn[i]]][j]=max(dp[i+sz[dfn[i]]][j],dp[i][j]);
	cout<<dp[n][m];
	return 0;
}
2021/8/17 10:21
加载中...