Ural 1018 树dp

来源:互联网 发布:python正态分布随机数 编辑:程序博客网 时间:2024/04/28 08:50

PRO IS HERE


树dp


#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#include<vector>#include<set>#include<queue>#include<map>using namespace std;#define PB push_back#define INS insert#define FOR(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)#define nMax 201#define bug puts("Fuck");int dp[nMax][nMax];int son[nMax];int first[nMax],nxt[nMax],fa[nMax],w[nMax],to[nMax],e,vis[nMax];void addedge(int u,int v,int f){to[e]=v;fa[e]=u;w[e]=f;nxt[e]=first[u];first[u]=e;e++;to[e]=u;fa[e]=v;w[e]=f;nxt[e]=first[v];first[v]=e;e++;}int Q,n,ans;void dfs(int u){son[u]=1;vis[u]=1;for(int i=first[u];i!=-1;i=nxt[i])if(!vis[to[i]]) {dfs(to[i]);son[u]+=son[to[i]];}return ;}void DP(int u){for(int i=0;i<=Q;i++) dp[u][i]=0;vis[u]=1;for(int i=first[u],v;i!=-1;i=nxt[i])if(!vis[v=to[i]]){DP(v);for(int j=Q;j>=1;j--) {for(int k=0;k<j;k++) dp[u][j] = max(dp[u][j],dp[v][k] + w[i] + dp[u][j-k-1]);}}//ans = max(ans,dp[u][Q]);}int main(){//freopen("input.txt","r",stdin);//freopen("output.txt","w",stdout);while(~scanf("%d%d",&n,&Q)){memset(first,-1,sizeof(first));e=0;ans = 0;for(int i=1,u,v,f;i<n;i++) {scanf("%d%d%d",&u,&v,&f);addedge(u,v,f);}memset(vis,0,sizeof(vis));DP(1);printf("%d\n",dp[1][Q]);}return 0;}


原创粉丝点击