hdu 4003 Find Metal Mineral 树形DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4003
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cstdlib> 5 #include<cmath> 6 #include<algorithm> 7 #include<vector> 8 #include<map> 9 #define inf 0x7fffffff 10 using namespace std; 11 const int maxn=10000+10; 12 13 int n,s,k; 14 int father[maxn],dp[maxn][12]; 15 vector<pair<int,int> > G[maxn]; 16 17 void dfs(int u,int f) 18 { 19 father[u]=f; 20 int num=G[u].size(); 21 for (int i=0 ;i<num ;i++) 22 { 23 int v=G[u][i].first; 24 int cost=G[u][i].second; 25 if (v==f) continue; 26 dfs(v,u); 27 for (int j=k ;j>=0 ;j--) 28 { 29 dp[u][j] += dp[v][0]+2*cost; 30 for (int q=1 ;q<=j ;q++) 31 dp[u][j]=min(dp[u][j],dp[u][j-q]+dp[v][q]+q*cost); 32 } 33 } 34 } 35 36 int main() 37 { 38 while (scanf("%d%d%d",&n,&s,&k)!=EOF) 39 { 40 memset(father,-1,sizeof(father)); 41 memset(dp,0,sizeof(dp)); 42 for (int i=1 ;i<=n ;i++) G[i].clear(); 43 int a,b,c; 44 for (int i=0 ;i<n-1 ;i++) 45 { 46 scanf("%d%d%d",&a,&b,&c); 47 G[a].push_back(make_pair(b,c)); 48 G[b].push_back(make_pair(a,c)); 49 } 50 dfs(s,-1); 51 printf("%d\n",dp[s][k]); 52 } 53 return 0; 54 }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。