这道题就是Tsp问题,稍微加了些改变

注意以下问题

(1)每个点可以经过多次,这里就可以用弗洛伊德初始化最短距离

(2)在循环中集合可以用S表示更清晰一些

(3)第一维为状态,第二维为在哪个点,不要写混。

(4)在dp过程中0这个点是不用的,只用到1到n这个点

而实际上dp过程中用的是0到n-1,所以就枚举1到n,然后涉及到集合的地方就写i-1

其他地方如dp的第二维,距离这些都不变。

还有一个方法,是我一开始想的方法,就是在输入的时候就把0放到第n个点,其他下标-1

(4)这道题求最小值,一定要先初始化为最大值

方法一(涉及到集合的时候下标-1)

#include<cstdio>
#include<cstring>
#include<algorithm>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
#define _for(i, a, b) for(int i = (a); i <= (b); i++)
using namespace std; const int MAXN = 15;
int dist[MAXN][MAXN], dp[1 << 11][MAXN], n; int main()
{
while(~scanf("%d", &n) && n)
{
_for(i, 0, n)
_for(j, 0, n)
scanf("%d", &dist[i][j]); _for(k, 0, n)
_for(i, 0, n)
_for(j, 0, n)
dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]); memset(dp, 0x3f, sizeof(dp));
_for(i, 1, n) dp[1 << (i - 1)][i] = dist[0][i];
REP(S, 0, 1 << n)
_for(i, 1, n) if(S & (1 << (i - 1)))
_for(j, 1, n) if(S & (1 << (j - 1)))
dp[S][i] = min(dp[S][i], dp[S^(1<<(i-1))][j] + dist[j][i]); int ans = 1e9;
_for(i, 1, n)
ans = min(ans, dp[(1 << n) - 1][i] + dist[i][0]);
printf("%d\n", ans);
} return 0;
}

方法二(直接在输入的时候改变)

#include<cstdio>
#include<cstring>
#include<algorithm>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
#define _for(i, a, b) for(int i = (a); i <= (b); i++)
using namespace std; const int MAXN = 15;
int dist[MAXN][MAXN], dp[1 << 11][MAXN], n; int main()
{
while(~scanf("%d", &n) && n)
{
_for(i, 0, n)
_for(j, 0, n)
scanf("%d", &dist[(!i ? n : i - 1)][(!j ? n : j - 1)]); _for(k, 0, n)
_for(i, 0, n)
_for(j, 0, n)
dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]); memset(dp, 0x3f, sizeof(dp));
REP(i, 0, n) dp[1 << i][i] = dist[n][i];
REP(i, 0, 1 << n)
REP(j, 0, n) if(i & (1 << j))
REP(k, 0, n) if(i & (1 << k))
if(j != k)
dp[i][j] = min(dp[i][j], dp[i^(1<<j)][k] + dist[k][j]); int ans = 1e9;
REP(i, 0, n)
ans = min(ans, dp[(1 << n) - 1][i] + dist[i][n]);
printf("%d\n", ans);
} return 0;
}

最新文章

  1. Windows操作系统下远程连接MySQL数据库
  2. CodeForces 37E Trial for Chief
  3. SQL Developer 4.0 启动报错“unable to create an instance of the java virtual machine located at path”
  4. .NET下的并行开发
  5. 如何查询MySql日志
  6. (转)HashMap分析
  7. ios 缓存策略
  8. SQL SERVER中的逻辑读,预读和物理读
  9. mvc框架下,怎样用cookie实现下次自动登录
  10. 项目管理-SVN服务器的搭建
  11. winform 以不规则图形背景显示窗体
  12. 7年,OpenStack从入门到放弃|送书
  13. Windows和Linux的Jmeter分布式集群压力测试
  14. 用软件工程分析开源项目octave的移植
  15. 检索(retrieval &amp;&amp; search )-单目标-多目标跟踪-MTMC Tracking和 ReID
  16. Centos 添加用户和用户组
  17. Day5 类和对象
  18. rarcrack
  19. ubuntu 16.04 安装opencv 2.4.13
  20. 2015/9/2 Python基础(7):元组

热门文章

  1. grep的各种用法
  2. 使用maven创建springMVC时返回页面报错
  3. 提高生产力:SpringMVC中,使用扩展数据类型TypedMap接收Web请求参数
  4. PHP学习总结(9)——PHP入门篇之WAMPServer服务控制面板介绍
  5. Windows-命令窗口-强制关机命令
  6. [HTML 5] Atomic Relevant Busy
  7. MySql 基础学习笔记 1——概述与基本数据类型: 整型: 1)TINYINT 2)SMALLINT 3) MEDIUMINT 4)INT 5)BIGINT 主要是大小的差别 图 浮点型:命令
  8. Swift String转Character数组
  9. 英语发音规则---K字母
  10. spark 随机森林算法案例实战