P1171 售货员的难题

题目背景

数据有更改

题目描述

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

输入输出格式

输入格式:

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

输出格式:

最短的路程。

输入输出样例

输入样例#1: 复制

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

3

说明

输入解释

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 售货员的难题的更多相关文章

  1. 洛谷 P1171 售货员的难题

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

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

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

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

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

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

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

  5. P1171 售货员的难题

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

  6. 洛谷 P1379 八数码难题 Label:判重&&bfs

    特别声明:紫书上抄来的代码,详见P198 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给 ...

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

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

  8. P1171 售货员的难题--搜索(剪枝)

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

  9. 洛谷P1379八数码难题

    题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中. 要求解的问题是:给出一种初始布局(初始状态)和目标布局(为 ...

随机推荐

  1. sqlserver 新建只读权限用户

    1,新建只能访问某一个表的只读用户. --添加只允许访问指定表的用户:execsp_addlogin'用户名','密码','默认数据库名' --添加到数据库execsp_grantdbaccess'用 ...

  2. java--xml文件读取(DOM)

    1.表现:一“.xml”为扩展名的文件 2.存储:树形结构 3.xml解析应用: 不同应用程序之间的通信-->订票软件和支付软件 不同的平台间通信-->操作系统 不同平台间数据的共享--& ...

  3. linux命令学习笔记(10):cat 命令

    cat命令的用途是连接文件或标准输入并打印.这个命令常用来显示文件内容,或者将几个文件连接起来显示, 或者从标准输入读取内容并显示,它常与重定向符号配合使用. .命令格式: cat [选项] [文件] ...

  4. 不要使用Android Studio的Git Commit了---->记一次debug

    今天下午写了一些代码,吃晚饭时分用Android Studio commit了一下,不知道有没有选择Commit and push,结果刚才代码出bug我想回滚到上个版本的时候,发现Android S ...

  5. php断点续传

    http://www.cnblogs.com/xproer/archive/2012/10/26/2741264.html

  6. 关于linux 安装 python pymssql模块

    需要先安装freetds是一个开源的C程序库,它可以实现在Linux系统下访问操作微软的SQL数据库.可以用在Sybase的db-lib或者ct-lib库,在里面也包含了一个ODBC的库.允许许多应用 ...

  7. POJ-1564 dfs

    #include"cstring" #include"cstdio" +; int nux[maxn]; int nua[maxn];//解的集合 int t; ...

  8. 服务器FTP配置

    一.如果没有安装FTP服务器,安装如下: 二.添加SSL证书 三.给证书起一个有意义的名字就可以了 四.FTP  SSL设置 五.FTP 身份验证: 进入-如果开启自己需要的-我这里是需要用户输入密码 ...

  9. CentOS 7关闭firewalld启用iptables

    在CentOS7中,有很多CentOS 6中的常用服务发生了变化. 其中iptables是其中比较大的一个.防火墙iptables被firewalld取代. 本文将介绍,如果采用systemctl关闭 ...

  10. 图解Stm32使用jlink下载程序时jtag接口(SW和JTAG模式)的简化方法

    转自: http://www.it165.net/embed/html/201308/2332.html 用过stm32的人都知道stm32有两种常用下载程序的方法,用串口和jlink.串口下载方法和 ...