标签:
Time Limit: 1000MS | Memory Limit: 65536KB | 64bit IO Format: %I64d & %I64u |
Description
2 5
\ /
3 4
\ /
1
|
Input
Output
Sample Input
input | output |
---|---|
5 2
1 3 1
1 4 10
2 3 20
3 5 20
|
21
|
Source
1 /*by SilverN*/ 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cstdio> 6 #include<cmath> 7 using namespace std; 8 const int mxn=200; 9 struct edge{ 10 int v,w; 11 int nxt; 12 }e[mxn]; 13 int hd[mxn],mct=0; 14 void add_edge(int u,int v,int dis){ 15 e[++mct].v=v;e[mct].nxt=hd[u];e[mct].w=dis;hd[u]=mct; 16 return; 17 } 18 int f[mxn][mxn]; 19 int num[mxn]; 20 int n,m; 21 void dp(int u,int fa){ 22 int i,j,k; 23 num[u]=0; 24 for(i=hd[u];i;i=e[i].nxt){ 25 int v=e[i].v; 26 if(v==fa)continue; 27 dp(v,u); 28 num[u]+=num[v]+1; 29 for(j=num[u];j;--j){ 30 for(k=j;k;k--){ 31 f[u][j]=max(f[u][j],f[u][j-k]+f[v][k-1]+e[i].w); 32 } 33 } 34 } 35 return; 36 } 37 int main(){ 38 scanf("%d%d",&n,&m); 39 int i,j; 40 int u,v,d; 41 for(i=1;i<n;i++){ 42 scanf("%d%d%d",&u,&v,&d); 43 add_edge(u,v,d); 44 add_edge(v,u,d); 45 } 46 dp(1,0); 47 printf("%d\n",f[1][m]); 48 return 0; 49 }
标签:
原文地址:http://www.cnblogs.com/SilverNebula/p/5918359.html