社区讨论

萌新求助

P2014[CTSC1997] 选课参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lobyobbp
此快照首次捕获于
2023/10/30 05:06
2 年前
此快照最后确认于
2023/11/04 10:23
2 年前
查看原帖
RT , 把树变成了DFS序 , 然后正着做错了 , 反着做却对了 ? 为什么 ?
CPP
#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;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...