2596 售货员的难题

 时间限制: 1 s
 空间限制: 32000 KB
 题目等级 : 钻石 Diamond
 
 
题目描述 Description

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

输入描述 Input Description

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

输出描述 Output Description

最短的路程

样例输入 Sample Input

3

0 2 1

1 0 2

2 1 0

样例输出 Sample Output

3

数据范围及提示 Data Size & Hint

本题可用最短路思想、搜索来解决,但是可能无法通过一组极限数据(且效率较低)。建议按树状DP考虑

/*
状压dp入门题
f[i][j]表示当前状态为i,走到第j个城市最短路径
相应的状态转移方程为f[i][j]=min( f[i^(1<<j)][k]+g[k][j]);
i^(1<<j)的意思是将j这个城市从i状态中去掉.g[k][j]是k和j之间的距离。
*/
#include<iostream>
#include<cstdio>
#include<cstring> #define maxn 50010 using namespace std;
int n,g[][],f[maxn][],ans; int min(int x,int y){return x<y?x:y;} int main()
{
scanf("%d",&n);n--;
memset(f,/,sizeof(f));
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
scanf("%d",&g[i][j]);
ans=f[][];f[][]=;
for(int i=;i<(<<n);i++)
for(int j=;j<=n;j++)if(i&(<<j-))
for(int k=;k<=n;k++)
f[i][j]=min(f[i][j],f[i^(<<j-)][k]+g[k][j]);
for(int i=;i<=n;i++)
ans=min(ans,f[(<<n)-][i]+g[i][]);
printf("%d\n",ans);
return ;
}

最新文章

  1. Javascript的GET、POST请求
  2. 转一个 Xcode 7 缺少 *.dylib库的解决方法
  3. SecureCRT中文乱码解决已设置UTF-8
  4. Prim算法(一)之 C语言详解
  5. xmind 使用备忘
  6. uglifyjs压缩JS
  7. 作品展示,JavaScript 版水果忍者
  8. JavaScript console 用法大全
  9. NSString的几个方法(rangeOfString,hasPrefix,hasSuffix,改变大小写...)
  10. 【微软大法好】VS Tools for AI全攻略(2)
  11. Python基础--函数的定义和调用
  12. H.264学习--1
  13. SQL参数放在where前后的区别
  14. PHP查看内存使用
  15. postgresql-pg_prewarm数据预加载。
  16. gitlab的md文件内使用锚点
  17. IntelliJ idea配置python
  18. Linux 工具,一本好书 大牛的博客
  19. 【原创】PHPstorm本地修改同步保存到远程服务器
  20. Docker+.Net Core 的那些事儿-1.准备工作

热门文章

  1. ABP初始化
  2. Codeforces_732D_(二分贪心)
  3. Origin C调用NAG库
  4. Fang Fang HDU - 5455 (思维题)
  5. Spring MVC 笔记2 HelloWorld
  6. Python基础-while奇数和
  7. hadoop2.3.0cdh5.0.2 升级到cdh5.7.0
  8. 【codeforces 796A】Buying A House
  9. noip模拟赛 解谜游戏
  10. [bzoj1103][POI2007]大都市meg_dfs序_树状数组