邮局 100分代码(dfs+多重剪枝)
#include<iostream>
#include<algorithm>
#include<set>
#include<string>
#include<cstring>
#include<vector>
#include<cmath>
using namespace std;
const double inf = 1.7e300;
struct node
{
int x, y;
}point[55], post[30];
double mp[55][55];
int flag[55];
int n, m, k;
double res = inf;
int cur[55];
int ans[55];
double dis(node a, node b)
{
return sqrt((a.x - b.x)*(a.x - b.x) + (a.y - b.y)*(a.y - b.y));
}
//st表示当前考虑的邮局编号,sum_k表示的是已经加入的post总数,tmp_r[]表示
void dfs(int st, int sum_k, double sum_r, double tmp_r[])
{
if ((k - (sum_k-1)) > (m - (st-1))) return;//剪枝 1:左边表示还需要加入的邮局,右边表示剩余的邮局,邮局数量不够
if (st > m && sum_k <= k) return; //剪枝 2:已经没有剩余的邮局了,并且k个邮局还未加满
// if (sum_k > k+1) return;
if (sum_k == k+1)
{
//cout <<" shuchu" << st-1 << " " << sum_k-1 << " " << sum_r << endl;
if (res > sum_r)
{
res = sum_r;//更新,保存每一个邮局的编号
for (int i = 1; i <= k; i++)
{
ans[i] = cur[i];
}
}
return;
}
double dis_r[55];//必须重新定义一个数组才属于这个函数
for (int i = 1; i <= n; i++)
{
dis_r[i] = tmp_r[i];
}
dfs(st + 1, sum_k, sum_r, dis_r);//不建造此邮局
if (flag[st] == 1) return;//表示当前位置的邮局对于缩短距离没有增益,直接return,不需要考虑选择该邮局地点的方案
//下面表示加入当前邮局的情况
cur[sum_k] = st;//加入
int mark1 = 0, mark2 = 0;
if (sum_k ==1)//第一个邮局,初始化 dis_r
{
for (int i = 1; i <= n; i++)
{
dis_r[i] = mp[i][st];
sum_r += mp[i][st];
}
mark1 = 1;
}
else
{
for (int i = 1; i <= n; i++)
{
if (dis_r[i] > mp[i][st])
{
mark2 = 1;
sum_r += mp[i][st] - dis_r[i];
dis_r[i] = mp[i][st];
}
}
}
if (mark1 == 0 && mark2 == 0) flag[st] = 1;
if (mark1 == 1 || mark2 == 1) dfs(st + 1, sum_k + 1, sum_r, dis_r);
return;
}
void init()
{
for (int i = 1; i <= n; i++)
{
scanf("%d %d", &point[i].x, &point[i].y);
}
for (int i = 1; i <= m; i++)
{
scanf("%d %d", &post[i].x, &post[i].y);
}
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
mp[i][j] = dis(point[i], post[j]);
}
}
}
int main()
{
scanf("%d %d %d", &n, &m, &k);
init();
double dis_r[55];
memset(dis_r, -1, sizeof(dis_r));
dfs(1, 1, 0, dis_r);
for (int i = 1; i <= k; i++)
{
cout << ans[i] << " ";
}
return 0;
}
邮局 100分代码(dfs+多重剪枝)的更多相关文章
- 100行代码实现最简单的基于FFMPEG+SDL的视频播放器(SDL1.x)【转】
转自:http://blog.csdn.net/leixiaohua1020/article/details/8652605 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] ...
- hdoj--1010<dfs+奇偶剪枝>
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1010 题目描述:在n*m的矩阵中,有一起点和终点,中间有墙,给出起点终点和墙,并给出步数,在该步数情况 ...
- hdu1010 Tempter of the Bone —— dfs+奇偶性剪枝
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1010 Tempter of the Bone Time Limit: 2000/1000 MS (Ja ...
- 【转】100行代码实现最简单的基于FFMPEG+SDL的视频播放器
FFMPEG工程浩大,可以参考的书籍又不是很多,因此很多刚学习FFMPEG的人常常感觉到无从下手.我刚接触FFMPEG的时候也感觉不知从何学起. 因此我把自己做项目过程中实现的一个非常简单的视频播放器 ...
- 100行代码实现现代版Router
原文:http://www.html-js.com/article/JavaScript-version-100-lines-of-code-to-achieve-a-modern-version ...
- 用JavaCV改写“100行代码实现最简单的基于FFMPEG+SDL的视频播放器 ”
FFMPEG的文档少,JavaCV的文档就更少了.从网上找到这篇100行代码实现最简单的基于FFMPEG+SDL的视频播放器.地址是http://blog.csdn.net/leixiaohua102 ...
- 100行代码让您学会JavaScript原生的Proxy设计模式
面向对象设计里的设计模式之Proxy(代理)模式,相信很多朋友已经很熟悉了.比如我之前写过代理模式在Java中实现的两篇文章: Java代理设计模式(Proxy)的四种具体实现:静态代理和动态代理 J ...
- GuiLite 1.2 发布(希望通过这100+行代码来揭示:GuiLite的初始化,界面元素Layout,及消息映射的过程)
经过开发群的长期验证,我们发现:即使代码只有5千多行,也不意味着能够轻松弄懂代码意图.痛定思痛,我们发现:虽然每个函数都很简单(平均长度约为30行),可以逐个击破:但各个函数之间如何协作,却很难说明清 ...
- 【编程教室】PONG - 100行代码写一个弹球游戏
大家好,欢迎来到 Crossin的编程教室 ! 今天跟大家讲一讲:如何做游戏 游戏的主题是弹球游戏<PONG>,它是史上第一款街机游戏.因此选它作为我这个游戏开发系列的第一期主题. 游戏引 ...
随机推荐
- Ubuntu 16.04 总出现红色圆圈警告和检测到系统程序出现问题
这种问题不可忽视!不可忽视!不可忽视!重要的事情说三遍!!!(一次死机,好多文件丢失,真是痛苦的经历) 自从从第三方安装了Python3.6,并将默认3.5改为3.6,导致ubuntu16.04右上角 ...
- 设计模式九: 观察者模式(Observer Pattern)
简介 观察者属于行为型模式的一种, 又叫发布-订阅模式. 如果一个对象的状态发生改变,依赖他的对象都将发生变化, 那么这种情况就适合使用观察者模式. 它包含两个术语,主题(Subject),观察者(O ...
- springboot上传文件 & 不配置虚拟路径访问服务器图片 & springboot配置日期的格式化方式 & Springboot配置日期转换器
1. Springboot上传文件 springboot的文件上传不用配置拦截器,其上传方法与SpringMVC一样 @RequestMapping("/uploadPicture&q ...
- jxl应用事例
实例中主要目的是解析jxl使用流程以及jxl绘制Excel的写法思路,代码掩去了项目中的真实数据,请根据需求酌情修改,如果有帮助到有需要的人,不胜欢喜. Dao层为查询数据库,返回list数据,此处省 ...
- vue-i18n国际化在data中切换不起作用
vue-i18n是一个针对于vue的国际化插件,使用非常简单,具体使用方式看我细细道来. 实现方式 1. 下载包 npm install vue-i18n 2. 配置 在main.js文件中加入如下配 ...
- 【深度学习】吴恩达网易公开课练习(class2 week1 task2 task3)
正则化 定义:正则化就是在计算损失函数时,在损失函数后添加权重相关的正则项. 作用:减少过拟合现象 正则化有多种,有L1范式,L2范式等.一种常用的正则化公式 \[J_{regularized} = ...
- java----Maven
下载地址 http://maven.apache.org/download.cgi 介绍 bin:运行脚本 windows 输入mvn可以运行这些脚本 boot:包含一个类加载器的框架,maven使用 ...
- JMeter Ultimate Thread Group阶梯式减压
选择或者搜索Stantard Set标准集, 我们要用的Ultimate Thread Group最终线程组包含在里面: 下载完成之后,JMeter会自动重启. 添加最终线程组: 还是以打开博客园首页 ...
- Log.isLoggable之一正确的使用姿势
DEBUG方法比较当我们在做APP开发时,需要设置调试开关打印Log,下面我列举出3种方法: 方法一:直接赋值public static final boolean DEBUG = true;//fa ...
- Expression Trees 参数简化查询
ASP.NET MVC 引入了 ModelBinder 技术,让我们可以在 Action 中以强类型参数的形式接收 Request 中的数据,极大的方便了我们的编程,提高了生产力.在查询 Action ...