SRM 477 DIV1 1000
来源:互联网 发布:贵州中小企业数据统计 编辑:程序博客网 时间:2024/04/28 04:36
题意:给定一棵树,最多可给这棵树增加k条捷径,每条捷径长度为L,且只能走一次,问从0出发回到0遍历所有的边需要走的最短距离。
树型dp,状态为dp[i][j][2]。
dp[i][j][0]表示从i出发,用了j次捷径,遍历完下面所有边且最后走的路径到底后没有回来的最小距离。
dp[i][j][1]表示从i出发,用了j次捷径,遍历完下面所有边且回到i的最小距离。
转移看代码:
#include <cstdio>#include <iostream>#include <cstring>#include <sstream>#include <algorithm>#include <cmath>#include <vector>#define clr(x,y) memset(x,y,sizeof(x))#define Min(x,y) if(y<x) x=y#define Max(x,y) if(y>x) x=yusing namespace std ;typedef long long ll ;const double eps = 1e-6 ;const int inf = 1e8;vector<int> ev[205],ew[205];int dp[205][105][2],p[105][2];string s = "";int K,L;class KingdomTour{public: void dfs(int u,int f){ for(int i=0;i<=K;i++) dp[u][i][0] = dp[u][i][1] = 0; for(int i=0;i<(int)ev[u].size();i++){ int v = ev[u][i]; int w = ew[u][i]; if(v==f) continue; dfs(v,u); for(int i=0;i<=K;i++) p[i][0] = p[i][1] = inf; for(int i=0;i<=K;i++) for(int j=0;j<=K;j++) if(i+j<=K){ Min(p[i+j+1][0],dp[u][i][0]+dp[v][j][0]+L+w); //之前有儿子节点不回来, v最后通过捷径回到u Min(p[i+j][0],dp[u][i][0]+dp[v][j][1]+2*w); //之前有儿子节点不回来, v直接走回到u Min(p[i+j][0],dp[u][i][1]+dp[v][j][0]+w); //之前没有儿子节点不回来,v不回到u Min(p[i+j][1],dp[u][i][1]+dp[v][j][1]+2*w); //之前没有儿子节点不回来,v直接走回到u Min(p[i+j+1][1],dp[u][i][1]+dp[v][j][0]+w+L); //之前没有儿子节点不回来,v最后通过捷径回到u Min(p[i+j+1][1],dp[u][i][0] + dp[v][j][0]+L+w); //之前有儿子节点不回来,直接走到当前儿子叶子节点走回来。 } for(int i=0;i<=K;i++){ dp[u][i][0] = p[i][0]; dp[u][i][1] = p[i][1]; } } }void get(int &w,int &i){ w = 0; while(i<(int)s.size() && s[i]<='9' && s[i]>='0'){ w = w*10 +s[i]-'0'; i++; } i++;}int minTime(int N, vector <string> roads, int K, int L){ ::K = K; ::L = L; s = ""; for(int i=0;i<(int)roads.size();i++) s += roads[i]; for(int i=0;i<N;i++) ev[i].clear(),ew[i].clear(); int l = 0; while(1){ int u,v,w; get(u,l); get(v,l); get(w,l); ev[u].push_back(v);ew[u].push_back(w); ev[v].push_back(u);ew[v].push_back(w); if(l>=(int)s.size()) break; } dfs(0,0); int ans = inf; for(int i=0;i<=K;i++) ans = min(ans,dp[0][i][1]);return ans;}};// Powered by FileEdit// Powered by TZTester 1.01 [25-Feb-2003]// Powered by CodeProcessor
- SRM 477 DIV1 1000
- [TC SRM 571] DIV1 1000
- TopCoder SRM 474 DIV1 1000
- SRM 510 Div1 1000 TheLuckyBasesDivOne
- srm 181 div1 1000(状压dp)
- SRM 465(DIV1 DIV2)
- SRM 465(DIV1 DIV2)
- SRM 144 DIV1 second
- SRM 507 DIV1 B
- SRM 513 DIV1 C
- SRM 500 DIV1 B
- 1-SRM 144 DIV1
- TC SRM 559 DIV1
- SRM 195 Div1 总结
- SRM 497 DIV1 550
- SRM 450 div1(practice)
- SRM 449 div1 (practice)
- SRM 448 div1(practice)
- eclipse failed to create the java virtual machine 问题图文解析
- 持续集成之路 —— Mock对象引起的测试失败
- Android游戏框架Libgdx使用入门
- 集合框架
- awk
- SRM 477 DIV1 1000
- VS2010中“工具>选项中的VC++目录编辑功能已被否决”解决方法
- Pro Android学习笔记(十三):用户界面和控制(1):UI开发
- HDU 1106 排序
- Vim 配置详解
- shell批量添加删除100用户
- 自己实现用FFT加速多项式计算
- poj 1179 动态规划
- 今天遇到一个Extjs窗口层次问题,找了半天找到一篇有用的