题目背景

数据有更改

题目描述

某乡有nn个村庄(1<n \le 201<n≤20),有一个售货员,他要到各个村庄去售货,各村庄之间的路程s(0<s<1000)s(0<s<1000)是已知的,且AA村到BB村与BB村到AA村的路大多不同。为了提高效率,他从商店出发到每个村庄一次,然后返回商店所在的村,假设商店所在的村庄为11,他不知道选择什么样的路线才能使所走的路程最短。请你帮他选择一条最短的路。

输入输出格式

输入格式:

村庄数nn和各村之间的路程(均是整数)。

输出格式:

最短的路程。

输入输出样例

输入样例#1: 复制

3
0 2 1
1 0 2
2 1 0
输出样例#1: 复制

3

------------------------------------------------------------
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
struct pd
{
int ha,e;
}lxy[][];
//存图,ha表示各点时间消耗,e表示要去的点,因为排序动列,不动行,所以记下列,就是要去的点
int hrb[],n,i,j,k,minn=1e9,maxn=,emm[];//新增一个emm数组解决排序动列的问题
int cmp(pd a,pd b)
{
return a.ha<b.ha;
}//排序函数
int ss(int x,int y,int z) //y记录走过的村庄数
{
if(z>=minn)
return ;//用sort优化,提前找出最小值,剪枝
if(z+n-y++maxn>=minn)//两地之间距离最短是1
return ;
//预见性剪枝,maxn表示x点到1的最小距离,然后剩余点取最小值1,极值判定
if(y==n)
{
minn=min(minn,z+emm[x]);
return ;
}
if(y<n)
for(int i=;i<=n;i++)
if(hrb[lxy[x][i].e]==)
//判断是否走过,为啥是lxy[x][i].e,请见上面解释
{
if(z+lxy[x][i].ha+n-y+maxn>minn)
return ;
//预见性剪枝,极值判定,用这两个可以90分
hrb[lxy[x][i].e]=;
ss(lxy[x][i].e,y+,z+lxy[x][i].ha);
hrb[lxy[x][i].e]=;
}
return ;
}
int main()
{
scanf("%d",&n);
for(i=;i<=n;i++)
{
for(k=;k<=n;k++)
{
scanf("%d",&lxy[i][k].ha);
lxy[i][k].e=k;//记录列数
if(i!=&&k==)
maxn=min(maxn,lxy[i][].ha),emm[i]=lxy[i][].ha;
//求x到1的最小时间花费,用于预见性剪枝,和存x到1的花费用于搜索结算,解决排序造成的列乱序的情况
}
sort(lxy[i]+,lxy[i]+n+,cmp);
//STL大法好,二维数组的排序要用for,sort可以优化找出的答案minn,减少无用功
}
hrb[]=;//跑过了就要踩,不然会跑回去,想想80分代码为啥不用赋值为1?因为80分列没乱序
ss(,,);
printf("%d",minn);
return ;
}

这道题吧

标签上是搜索

然而

大部分都是状压dp

但还好

还有写搜索的

(我坚持写搜索的原因就是我搜索不太好)

虽然草草的写了一个

还过了样例

但全wa了

庆幸了一小下

没有tle mle什么的

但当我不太会改的时候

才知道我的搜索是totally错的

向现实低头的我

有卑微看题解了

(题解都在代码中)

P1171 售货员的难题--搜索(剪枝)的更多相关文章

  1. 洛谷P1171 售货员的难题

    P1171 售货员的难题 题目背景 数据有更改 题目描述 某乡有n个村庄(1<n<20),有一个售货员,他要到各个村庄去售货,各村庄之间的路程s(0<s<1000)是已知的,且 ...

  2. P1171 售货员的难题

    P1171 售货员的难题 题目描述 某乡有nn个村庄(1<n \le 201<n≤20),有一个售货员,他要到各个村庄去售货,各村庄之间的路程s(0<s<1000)s(0< ...

  3. 洛谷 P1171 售货员的难题

    P1171 售货员的难题 题目背景 数据有更改 题目描述 某乡有n个村庄(1<n<20),有一个售货员,他要到各个村庄去售货,各村庄之间的路程s(0<s<1000)是已知的,且 ...

  4. 【题解】P1171 售货员的难题

    Tags 搜索,状压​. 裸的旅行商问题 #include <stdio.h> #include <string.h> #define re register #define ...

  5. 洛谷 P1171 售货员的难题 【状压dp】

    题目描述 某乡有n个村庄(1<n<20),有一个售货员,他要到各个村庄去售货,各村庄之间的路程s(0<s<1000)是已知的,且A村到B村与B村到A村的路大多不同.为了提高效率 ...

  6. 洛谷P1171 售货员的难题【状压DP】

    题目描述 某乡有n个村庄(1 输入格式: 村庄数n和各村之间的路程(均是整数). 输出格式: 最短的路程. 输入样例: 3 0 2 1 1 0 2 2 1 0 输出样例 3 说明 输入解释 3 {村庄 ...

  7. 2018.07.18 洛谷P1171 售货员的难题(状压dp)

    传送门 感觉是一道经典的状压dp,随便写了一发卡了卡常数开了个O(2)" role="presentation" style="position: relati ...

  8. P1171 售货员的难题 暴力dp

    题面 著名的TSP问题,NPC问题 对于数据大的情况,我们可以使用一系列近似算法进行寻找解. 对于数据规模小的情况,我们可以直接暴力dp 一开始写了一个dfs,然后就被n=20的数据卡爆了 #incl ...

  9. codevs 2596 售货员的难题

    2596 售货员的难题 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 钻石 Diamond 题目描述 Description 某乡有n个村庄(1<n<=15),有一个售货 ...

随机推荐

  1. vue从入门到进阶:计算属性computed与侦听器watch(三)

    计算属性computed 模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的.在模板中放入太多的逻辑会让模板过重且难以维护.例如: <div id="example" ...

  2. c++趣味之返回void

    void a(){} void b(){return a();} int main() { b(); ; } 这个是能编译的(vs,gcc),void函数是能返回,一般不会这么写,但是这样确实可以.你 ...

  3. html-edm(邮件营销)编写规则

    最近写了一个edm邮件 以前没有接触过  使用的是很老的html页面编写规则  只能用table标签  在此记录一下edm编写的一些规则 个人参考的是这两个网址,转载一下 http://www.zco ...

  4. linux 下svn操作

    * 前言: linux下的svn相比于gitlab,配置要求第一点:gitlab需要4G的内存,如果使用swap+内存的替代方案,理论上是可行的,但是实际操作中各种坑:     所以,由于条件限制,使 ...

  5. Keras深度学习框架安装及快速入门

    1.下载安装Keras 如果你是安装的Anaconda组合套件,可以直接在Prompt上执行安装命令:pip install keras 注意:最下面为Successfully...表示安装成功! 2 ...

  6. x3D 下载以及如何使用原版NetBeans IDE 来搭建x3d编辑环境

    安装前: Overview X3D-Edit version 3.3 standalone application and Netbeans plugin are available and read ...

  7. SQL中常用系统函数

    --1 CONVERT(数据类型,表达式),CAST( 表达式 AS 数据类型) 转变数据类型--将数字转化为字符串SELECT CONVERT(varchar(2),12)+CONVERT(varc ...

  8. spring4笔记----web.xml中2.4以上版本Listener的配置

    基本上没用过Servlet2.4以下版本,所以2.4版本以下不必学了 <?xml version="1.0" encoding="UTF-8"?> ...

  9. 单纯linux系统下hadoop2.7.3 eclipse,记一次成功的运行wordcount的注意事项

    hadoop要正确安装好 hadoop eclipse plugin要对应相应的eclipse版本 define hadoop location mr master:9000 另一个9001  下面的 ...

  10. replace函数使用方法

    Replace函数的含义~ 用新字符串替换旧字符串,而且替换的位置和数量都是指定的. replace函数的语法格式 =Replace(old_text,start_num,num_chars,new_ ...