标签:sample cin html sub col c++ min ups nbsp
给一棵n个节点的树, 节点编号为1~n, 每条边都有一个花费值。
有k个机器人从s点出发, 问让机器人遍历所有边,最少花费值多少?
第一行输入三个整数n(1 \le n \le 10^4), s(1 \le s \le n), k(1 \le k \le 10)n(1≤n≤104),s(1≤s≤n),k(1≤k≤10)。
接下来n-1行,每行三个整数x_i, y_i (1 \le x_i, y_i \le n, x_i \ne y_i), w_i(1 \le w_i \le 10^4)xi?,yi?(1≤xi?,yi?≤n,xi??=yi?),wi?(1≤wi?≤104), 表示x_i, y_ixi?,yi?之间有一条边,花费值为w_iwi?。
输入保证是一棵树。
输出最小花费值。
3 1 1 1 2 1 1 3 1
3
3 1 2 1 2 1 1 3 1
2
/************************************************************************* > Author: Henry Chen > Mail: 390989083@qq.com ************************************************************************/ #include<bits/stdc++.h> using namespace std; const int N = 10009; struct edge { int v,w; }e[2*N]; int head[N],nxt[2*N]; int tot = 0; int n,m,s; long long dp[N][15]; void add_edge(int u,int v,int w) { e[++tot] = (edge){v,w}; nxt[tot] = head[u]; head[u] = tot; } void dfs(int u,int fa) { for(int i = head[u];i != -1;i = nxt[i]) { int v = e[i].v; long long w = 1ll*e[i].w; if(v != fa) { dfs(v,u); for(int j = m;j >= 1;j--) { dp[u][j] += dp[v][0] + 2 * w; for(int k = 1;k <= j;k++) { dp[u][j] = min(dp[u][j],dp[u][j-k]+dp[v][k]+w * k); } } dp[u][0] += dp[v][0] + 2 * w; } } } int main() { cin >> n >> s >> m; memset(head,-1,sizeof(head)); memset(dp,0,sizeof(dp)); tot = 0; for(int i = 1;i < n;i++) { int u,v,w; scanf("%d%d%d",&u,&v,&w); add_edge(u,v,w); add_edge(v,u,w); } dfs(s,-1); printf("%lld\n",dp[s][m]); return 0; }
标签:sample cin html sub col c++ min ups nbsp
原文地址:https://www.cnblogs.com/mzyy1001/p/13592136.html