洛谷P1171 售货员的难题
P1171 售货员的难题
题目背景
数据有更改
题目描述
某乡有n个村庄(1<n<20),有一个售货员,他要到各个村庄去售货,各村庄之间的路程s(0<s<1000)是已知的,且A村到B村与B村到A村的路大多不同。为了提高效率,他从商店出发到每个村庄一次,然后返回商店所在的村,假设商店所在的村庄为1,他不知道选择什么样的路线才能使所走的路程最短。请你帮他选择一条最短的路。
输入输出格式
输入格式:
村庄数n和各村之间的路程(均是整数)。
输出格式:
最短的路程。
输入输出样例
说明
输入解释
3 {村庄数}
0 2 1 {村庄1到各村的路程}
1 0 2 {村庄2到各村的路程}
2 1 0 {村庄3到各村的路程}
/*
洛谷上只能到90分qwq
*/
#include<iostream>
#include<cstdio>
#define maxn 20
int n,num,head[maxn],ans=0x7fffffff;
struct node{
int to,pre,v;
}e[maxn*maxn];
bool vis[maxn];
using namespace std;
void Insert(int from,int to,int v){
e[++num].to=to;
e[num].v=v;
e[num].pre=head[from];
head[from]=num;
}
void dfs(int pos,int cnt,int dis){
if(dis>=ans)return;
if(dis+n-cnt+>=ans)return;
for(int i=head[pos];i;i=e[i].pre){
int to=e[i].to;
if(to==&&cnt==n){
ans=min(ans,dis+e[i].v);
return;
}
if(vis[to])continue;
vis[to]=;
dfs(to,cnt+,dis+e[i].v);
vis[to]=;
}
}
int qread(){
int i=;
char ch=getchar();
while(ch<''||ch>'')ch=getchar();
while(ch<=''&&ch>=''){i=i*+ch-'';ch=getchar();}
return i;
}
int main(){
freopen("Cola.txt","r",stdin);
n=qread();
int x;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++){
x=qread();
if(i!=j)Insert(i,j,x);
}
vis[]=;
dfs(,,);
printf("%d",ans);
}
90分 搜索+剪枝
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,map[][],all,dp[][<<],ans=0x7fffffff;
int qread(){
int i=;
char ch=getchar();
while(ch<''||ch>'')ch=getchar();
while(ch<=''&&ch>=''){i=i*+ch-'';ch=getchar();}
return i;
}
int main(){
freopen("Cola.txt","r",stdin);
//scanf("%d",&n);
n=qread();
all=(<<n)-;
for(int i=;i<=n;i++)for(int j=;j<=n;j++)map[i][j]=qread();
memset(dp,0x3f,sizeof(dp));
dp[][]=;
for(int i=;i<=n;i++)dp[i][<<(i-)]=map[][i];
for(int s=;s<=all;s++){
for(int i=;i<=n;i++)
if(s&(<<(i-)))
for(int j=;j<=n;j++)
dp[i][s]=min(dp[i][s],dp[j][s^(<<(i-))]+map[j][i]);
}
for(int i=;i<=n;i++)ans=min(ans,dp[i][all]+map[i][]);
printf("%d",ans);
}
80分 状压+枚举
#include<iostream>
#include<cstdio>
#include<cstring>
#define min(a,b) (a)>(b)?(b):(a)
int n,map[][],all,dp[][<<],ans=0x7fffffff,bit[];
int qread(){
int i=;
char ch=getchar();
while(ch<''||ch>'')ch=getchar();
while(ch<=''&&ch>=''){i=i*+ch-'';ch=getchar();}
return i;
}
int main(){
freopen("Cola.txt","r",stdin);
//scanf("%d",&n);
bit[]=;
for(int i=;i<=;i++)bit[i]=bit[i-]<<;
n=qread();
all=(<<n)-;
for(int i=;i<=n;i++)for(int j=;j<=n;j++)map[i][j]=qread();
memset(dp,0x3f,sizeof(dp));
dp[][]=;
for(int s=;s<=all;s+=){
for(int i=;i<=n;i++)
if(dp[i][s]<=)
for(int j=;j<=n;j++)
if(!(s&bit[j]))
dp[j][s|bit[j]]=min(dp[j][s|bit[j]],dp[i][s]+map[i][j]);
}
for(int i=;i<=n;i++)ans=min(ans,dp[i][all]+map[i][]);
printf("%d",ans);
}
100分 状压
洛谷P1171 售货员的难题的更多相关文章
- 洛谷 P1171 售货员的难题
P1171 售货员的难题 题目背景 数据有更改 题目描述 某乡有n个村庄(1<n<20),有一个售货员,他要到各个村庄去售货,各村庄之间的路程s(0<s<1000)是已知的,且 ...
- 洛谷 P1171 售货员的难题 【状压dp】
题目描述 某乡有n个村庄(1<n<20),有一个售货员,他要到各个村庄去售货,各村庄之间的路程s(0<s<1000)是已知的,且A村到B村与B村到A村的路大多不同.为了提高效率 ...
- 洛谷P1171 售货员的难题【状压DP】
题目描述 某乡有n个村庄(1 输入格式: 村庄数n和各村之间的路程(均是整数). 输出格式: 最短的路程. 输入样例: 3 0 2 1 1 0 2 2 1 0 输出样例 3 说明 输入解释 3 {村庄 ...
- 2018.07.18 洛谷P1171 售货员的难题(状压dp)
传送门 感觉是一道经典的状压dp,随便写了一发卡了卡常数开了个O(2)" role="presentation" style="position: relati ...
- P1171 售货员的难题
P1171 售货员的难题 题目描述 某乡有nn个村庄(1<n \le 201<n≤20),有一个售货员,他要到各个村庄去售货,各村庄之间的路程s(0<s<1000)s(0< ...
- 洛谷 P1379 八数码难题 Label:判重&&bfs
特别声明:紫书上抄来的代码,详见P198 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给 ...
- 【题解】P1171 售货员的难题
Tags 搜索,状压. 裸的旅行商问题 #include <stdio.h> #include <string.h> #define re register #define ...
- P1171 售货员的难题--搜索(剪枝)
题目背景 数据有更改 题目描述 某乡有nn个村庄(1<n \le 201<n≤20),有一个售货员,他要到各个村庄去售货,各村庄之间的路程s(0<s<1000)s(0<s ...
- 洛谷P1379八数码难题
题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中. 要求解的问题是:给出一种初始布局(初始状态)和目标布局(为 ...
随机推荐
- 分享知识-快乐自己:mybatis 主键回调
以下两种方式实现 主键回掉方式. <!--添加用户信息:主键回调--> <insert id="insertUser" useGeneratedKeys=&quo ...
- log4j No appenders could be found for logger
在main中加一句:BasicConfigurator.configure();
- error: ‘errno’ was not declared in this scope
问题: 将一个c文件改为cpp文件,其中的perror()改用C++中的std::cerr << strerror(error) << std::endl;来替换. 重新编译文 ...
- 分享几个高效编写JS 的心得
原则 不要做任何优化除非的确需要优化 任何的性能优化都必须以测量数据为基础,如果你怀疑代码存在性能问题,首先通过测试来验证你的想法.性能优化三问 我还能做哪些工作从而让代码变得更有效率? 流行的J ...
- ACM学习历程—UESTC 1219 Ba Gua Zhen(dfs && 独立回路 && xor高斯消元)
题目链接:http://acm.uestc.edu.cn/#/problem/show/1219 题目大意是给了一张图,然后要求一个点通过路径回到这个点,使得xor和最大. 这是CCPC南阳站的一道题 ...
- 基于无锁的C#并发队列实现
最近开始学习无锁编程,和传统的基于Lock的算法相比,无锁编程具有其独特的优点,Angel Lucifer的关于无锁编程一文对此有详细的描述. 无锁编程的目标是在不使用Lock的前提下保证并发过程中共 ...
- MySQL Explain详解(转)
explain SELECT a.* FROM test a,(select id from test where level_id <=4 order by aa_id limit 24300 ...
- DDoS攻防战(二):CC攻击工具实现与防御理论--删除
我们将要实现一个进行应用层DDoS攻击的工具,综合考虑,CC攻击方式是最佳选择,并用bash shell脚本来快速实现并验证这一工具,并在最后,讨论如何防御来自应用层的DDoS攻击. 第一步:获取大量 ...
- 一 Akka学习 - actor
(引用 http://shiyanjun.cn/archives/1168.html) 一: 什么是Akka? Akka是JAVA虚拟机JVM平台上构建高并发.分布式和容错应用的工具包和运行时,是一个 ...
- VisualGDB系列6:远程导入Linux项目到VS中
根据VisualGDB官网(https://visualgdb.com)的帮助文档大致翻译而成.主要是作为个人学习记录.有错误的地方,Robin欢迎大家指正. 本文介绍如何将Linux机器上的Linu ...