题意:

给n个点,给出矩阵代表i到j单向边的距离。

要求,不介意访问每个点的次数,要求访问完每个点,使得路程总和最小。

思路:

由于不介意访问每个点的次数,所以可以先进行FLOYD求出任意两个点之间的最短路,然后就是DP。

同样的,1代表有访问过,0代表没访问过。

dp[s][j]代表访问状态为s的情况下最终到达点j的最优值。

枚举状态s中每一个可以到达的点,从所有可能的点中枚举对其进行更新。

关于状态压缩的细节方面,注意从左边数第i位是从0开始数的,所以第i位代表第i+1个点。

然后状态的总数2^(n)-1.

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
//dp[s][i]代表从s状态到达城市i的最佳策略
const int inf=0x3f3f3f3f;
int pho[][];
int dp[<<][];
int main()
{
int n;
scanf("%d",&n);
while(n)
{
for(int i=;i<=n;i++)
{
for(int j=;j<=n;j++)
{
scanf("%d",&pho[i][j]);
}
}
for(int k=;k<=n;k++)
{
for(int i=;i<=n;i++)
{
for(int j=;j<=n;j++)
{
pho[i][j]=min(pho[i][k]+pho[k][j],pho[i][j]);
}
}
}
for(int s=;s<=(<<n)-;s++)
{
for(int i=;i<=n;i++)
{
if(s&(<<(i-)))
{
if(s==(<<(i-)))
{
dp[s][i]=pho[][i];
}
else
{
dp[s][i]=inf;
for(int j=;j<=n;j++)
{
if((s&(<<(j-)))&&i!=j)
{
dp[s][i]=min(dp[s][i],dp[s^(<<(i-))][j]+pho[j][i]);
}
}
}
}
}
}
int ans=inf;
for(int i=;i<=n;i++)
{
ans=min(ans,dp[(<<n)-][i]+pho[i][]);
}
printf("%d\n",ans);
scanf("%d",&n);
}
}

最新文章

  1. Hive官方手册翻译(Getting Started)
  2. contiki-进程
  3. Bootstrap 图标菜单按钮组件
  4. Namespaces(命名空间)
  5. mysql索引需要了解的几个注意
  6. oracle模糊查询效率可这样提高
  7. make执行过程
  8. 分享一款好用的PHP下ID混淆插件
  9. Jenkins使用-windows机器上的文件上传到linux
  10. unix域数据报回射程序(不完整)
  11. MySQL 笔记整理(3) --事务隔离,为什么你改了我还看不见?
  12. Chrome_查看 webSocket 连接信息
  13. 【转载】JsonLayout log4j2 json格式输出日志
  14. 【转】CentOS系统操作下安装相关各种软件
  15. python3爬虫——下载unsplash美图到本地
  16. 【个人阅读作业】软件工程M1/M2总结
  17. selenium去掉下载弹窗
  18. android api doc 一
  19. Thinkphp中查询复杂sql查询表达式,如何表达MYSQL中的某字段不为空is not null?
  20. Jenkins + GitLab 通过 Webhook 自动触发构建爬坑记录

热门文章

  1. 百度ue富文本编辑器setContent方法报错初始化加载内容失败解决办法
  2. android 实现拍照的2种方法
  3. ClassNotFoundException异常的解决方法
  4. yii 主从数据库分离-转载http://www.yiichina.com/doc/guide/2.0/db-dao
  5. 如何在ExtJS 6中使用Fashion美化应用程序
  6. Linux下编译java并生成jar包
  7. java学习笔记(三)字符串
  8. 在html中添加缩放meta
  9. windows7修改双系统启动项名称、先后顺序、等待时间
  10. JQuery validate 在IE兼容模式下出现 js错误(成员找不到)的修正: