标签:
#include <iostream> #include <cstdio> using namespace std; typedef long long LL; const double EPS = 1e-6; const int INF = 0x3fffffff; const LL LINF = INF * 1ll * INF; using namespace std; #define MAXN 5005 int head[MAXN],nxt[MAXN],e[MAXN],w[MAXN]; int cnt; LL dp[MAXN][55]; //适用于正负整数 template <class T> inline bool scan_d(T &ret) { char c; int sgn; if(c=getchar(),c==EOF) return 0; //EOF while(c!=‘-‘&&(c<‘0‘||c>‘9‘)) c=getchar(); sgn=(c==‘-‘)?-1:1; ret=(c==‘-‘)?0:(c-‘0‘); while(c=getchar(),c>=‘0‘&&c<=‘9‘) ret=ret*10+(c-‘0‘); ret*=sgn; return 1; } void addEdge(int u,int v,int w){ e[cnt] = v; ::w[cnt] = w; int tmp = head[u]; head[u] = cnt; nxt[cnt++] = tmp; } int n,k; void update(LL &ans,LL v){ if(ans>v) ans = v; } void dfs(int u,int fa){ for(int i = head[u];~i;i = nxt[i]){ if(e[i]==fa) continue; dfs(e[i],u); } for(int i = 0;i<=k;i++) dp[u][i] = LINF; dp[u][1] = 0; for(int i = head[u];~i;i = nxt[i]){ if(e[i]==fa) continue; int v = e[i]; for(int a = k;a>=0;a--){ for(int b = 1;a+b<=k;b++){ if(dp[v][b]==LINF) break; update(dp[u][a+b],dp[u][a]+dp[v][b]+2ll*b*(k-b)*w[i]); } } } } int main(void){ #ifndef ONLINE_JUDGE // freopen("/Users/mac/Desktop/data.in","r",stdin); #endif int t; scanf("%d",&t); while(t--){ //scanf("%d %d",&n,&k); scan_d(n); scan_d(k); for(int i = 1;i<=n;i++) head[i] = -1; cnt = 0; for(int i = 0;i<n-1;i++){ int u,v,w; scan_d(u); scan_d(v); scan_d(w); addEdge(u,v,w); addEdge(v,u,w); } LL ans = LINF; dfs(1,-1); for(int i = 1;i<=n;i++){ update(ans,dp[i][k]); } printf("%I64d\n",ans); } return 0; }
标签:
原文地址:http://www.cnblogs.com/usedrosee/p/4187863.html