社区讨论
萌新求助
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 条回复,欢迎继续交流。
正在加载回复...