题目链接:http://codeforces.com/contest/793/problem/D

题意:给出n个点m条边选择k个点,要求k个点是联通的而且不成环,而且选的边不能包含选过的边不能包含以前

选过的点,问最小的权值是多少。

题解:像这种取最小的一般可以考虑一下dp,然后再看一下题目,由于每次选的边都不能包括以前选的点,所以每

选择一条边能选择的区间范围就缩小了。

设dp[pos][l][r][k](这里可能会有人觉得开80*80*80*80会不会有点大了,自行计算一下不会爆内存的),pos表示当前位置,l表示区间左端点,r表示区间右端点,k表示还剩下多少条边没选当然也可以

设选了多少条边。附上记忆化搜索代码

int dfs(int pos , int l , int r , int count) {

if(dp[pos][l][r][count] != -1) {

return dp[pos][l][r][count];

}

if(count == 1) {

dp[pos][l][r][count] = 0;

return 0;

}

int sum = inf;

for(int i = 1 ; i <= n ; i++) {

if(mmp[pos][i] != inf) {

if(i > l && i < r) {

int sta = l , end = r;

if(i < pos) {

end = pos;

}

else {

sta = pos;

}

sum = min(sum , dfs(i , sta , end , count - 1) + mmp[pos][i]);

}

}

}

dp[pos][l][r][count] = sum;

return sum;

}

#include <iostream>
#include <cstring>
#include <cstdio>
#define inf 0X3f3f3f3f
using namespace std;
const int M = 82;
int n , k , m , u , v , c;
int mmp[M][M] , dp[M][M][M][M];
int dfs(int pos , int l , int r , int count) {
if(dp[pos][l][r][count] != -1) {
return dp[pos][l][r][count];
}
if(count == 1) {
dp[pos][l][r][count] = 0;
return 0;
}
int sum = inf;
for(int i = 1 ; i <= n ; i++) {
if(mmp[pos][i] != inf) {
if(i > l && i < r) {
int sta = l , end = r;
if(i < pos) {
end = pos;
}
else {
sta = pos;
}
sum = min(sum , dfs(i , sta , end , count - 1) + mmp[pos][i]);
}
}
}
dp[pos][l][r][count] = sum;
return sum;
}
int main() {
scanf("%d%d" , &n , &k);
scanf("%d" , &m);
memset(mmp , inf , sizeof(mmp));
for(int i = 0 ; i < m ; i++) {
scanf("%d%d%d" , &u , &v , &c);
mmp[u][v] = min(mmp[u][v] , c);
}
memset(dp , -1 , sizeof(dp));
int ans = inf;
for(int i = 1 ; i <= n ; i++) {
ans = min(ans , dfs(i , 0 , n + 1 , k));
}
if(ans == inf) {
printf("-1\n");
}
else {
printf("%d\n" , ans);
}
return 0;
}

最新文章

  1. Mysql日期时间大全
  2. p标签中的span标签文字垂直居中对齐
  3. wikioi 1430 素数判定
  4. android tween动画效果
  5. Light OJ 1037 - Agent 47(预处理状态压缩DP)
  6. angularJS常用命令
  7. 致网友Wonderfei的一封信(怎样选择自己主动化框架的几点拙见)
  8. 第三届蓝桥杯Java高职组决赛第一题
  9. Flask 学习 十四 测试
  10. OpenCV 闭合轮廓检测
  11. Mybatis常见问题总结
  12. jquery首页图片轮播
  13. linux-安装-源码安装
  14. java空心菱形
  15. ROS中发布IMU传感器消息
  16. Feign来调用服务
  17. hdu 1760 DFS+博弈
  18. maven 笔记:maven Could not create the Java Virtual Machine
  19. Android &quot;Please ensure that adb is correctly located at&quot; 错误
  20. su对环境变量做了什么

热门文章

  1. 自己动手,开发轻量级,高性能http服务器。
  2. 释放你的硬盘空间!——Windows 磁盘清理技巧
  3. 自练Eclipse搭建SSH全自动注解博客项目笔记
  4. Echarts图表插件(4.x版本)使用(二、带分类筛选的多个图表/实例化多个ECharts,以关系图/force为例)
  5. Netty服务端启动过程相关源码分析
  6. 浅谈单例模式及其java实现
  7. Hyper-V虚拟机上安装Ubuntu16.04/Ubuntu18.04.2LTS,搭建GitLab
  8. 消息中间件-activemq入门(二)
  9. Duilib的圆环形 进度条 实现(网易云信版本)
  10. linuxdeploy安装报错