hdu4003
2016-03-11 09:17
239 查看
链接:点击打开链接
题意:一棵N个节点的树,每条边都有一个权值,K个机器人从S点出发,问让机器人遍历所有边,最少花费值是多少
代码:
题意:一棵N个节点的树,每条边都有一个权值,K个机器人从S点出发,问让机器人遍历所有边,最少花费值是多少
代码:
#include <vector> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <iostream> #include <algorithm> using namespace std; int N,S,K; int dp[10005][15],used[10005]; //dp[i][j]代表以i为根节点的子树花费 struct node{ //j个机器人遍历的最少花费 int to,cost; }; vector<node> G[10005]; void dfs(int s){ int i,j,k,tmp; used[s]=1; for(i=0;i<G[s].size();i++){ tmp=G[s][i].to; if(G[tmp].size()&&!used[tmp]){ dfs(tmp); for(j=K;j>=0;j--){ //将一个机器人遍历以s为节点的树作为初始值 dp[s][j]+=(dp[tmp][0]+2*G[s][i].cost); for(k=1;k<=j;k++) dp[s][j]=min(dp[s][j],dp[s][j-k]+dp[tmp][k]+k*G[s][i].cost); } //树形dp } } } int main(){ int i,j,a,b,w; while(scanf("%d%d%d",&N,&S,&K)!=EOF){ for(i=1;i<=N;i++) G[i].clear(); memset(dp,0,sizeof(dp)); memset(used,0,sizeof(used)); for(i=0;i<N-1;i++){ scanf("%d%d%d",&a,&b,&w); G[a].push_back((node){b,w}); G[b].push_back((node){a,w}); } dfs(S); printf("%d\n",dp[S][K]); } return 0; }
相关文章推荐
- [NOI 2006]最大获利
- 常用工具记录
- stl hashmap与map hashmap与hashtable
- selenium在制定元素进行鼠标单击左键和释放的操作
- Dependency Injection in ASP.NET Web API 2
- Exchange Server 2016 独立部署/共存部署 (五)—— 配置DAG(下)
- android eclipse开发时Ctrl+鼠标左键不能打开xml文件
- 服务器 ××× 上的MSDTC不可用解决办法
- centos6.7下 编译安装MySQL5.7
- C++11带来的move语义
- SQL Server开启远程访问设置
- java 的知识点
- 在php7中使用thinkphp操作mysql数据库
- iOS App中UITableView左滑出现删除按钮及其cell的重用
- 新闻
- c语言函数指针的理解与使用
- Linux内核版本号命名的规则
- java synchronized详解
- File上传文件后缀名 限制
- Tomcat Server.xml详解