链接:http://poj.org/problem?id=3311

题意:有N个地点和一个出发点(N<=10),给出全部地点两两之间的距离,问从出发点出发,走遍全部地点再回到出发点的最短距离是多少。

思路:首先用floyd找到全部点之间的最短路。然后用状态压缩,dp数组一定是二维的,假设是一维的话不能保证dp[i]->dp[j]一定是最短的。由于dp[i]记录的“当前位置”不一定是能使dp[j]最小的当前位置。所以dp[i][j]中,i表示的二进制下的当前已经经过的状态,j表示的是在当前状态下眼下所在的位置。

代码:

#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <ctype.h>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>
#define eps 1e-8
#define INF 0x7fffffff
#define PI acos(-1.0)
#define seed 31//131,1313
#define maxn 15
typedef long long LL;
typedef unsigned long long ULL;
using namespace std;
int dp[1<<10][maxn];
int Pow[maxn];
int back[maxn];
int cost[maxn][maxn];
void init1()
{
Pow[0]=1;
for(int i=1; i<=10; i++)
Pow[i]=Pow[i-1]*2;
}
void init2()
{
for(int i=1; i<(1<<10); i++)
for(int j=0; j<=10; j++)
dp[i][j]=INF;
}
int floyd(int a[][maxn],int t)
{
for(int i=0; i<t; i++)
for(int j=0; j<t; j++)
for(int k=0; k<t; k++)
a[i][j]=min(a[i][k]+a[k][j],a[i][j]);
}
int main()
{
int T,x;
init1();
while(scanf("%d",&T))
{
init2();
if(!T)
break;
for(int i=0; i<T+1; i++)
for(int j=0; j<T+1; j++)
scanf("%d",&cost[i][j]);
floyd(cost,T+1); for(int i=0; i<T; i++)
dp[Pow[i]][i]=cost[0][i+1];
for(int i=0; i<T; i++)
back[i]=cost[i+1][0];
for(int i=0; i<T; i++)
for(int j=0; j<T; j++)
cost[i][j]=cost[i+1][j+1];
for(int i=0; i<(1<<T); i++)
{
if(i==1||i==2||i==4||i==8||i==16||i==32||i==64||i==128||i==256||i==512)
continue;
int ii=i;
int pos=0;
while(ii)
{
if(ii%2==1)
{
int t=i-Pow[pos];
for(int j=0; j<T; j++)
if(dp[t][j]!=INF&&dp[t][j]+cost[j][pos]<dp[i][pos])
dp[i][pos]=dp[t][j]+cost[j][pos];
}
ii>>=1;
pos++;
}
}
int ans=INF;
for(int i=0; i<T; i++)
{
if(dp[(1<<T)-1][i]!=INF&&dp[(1<<T)-1][i]+back[i]<ans)
ans=dp[(1<<T)-1][i]+back[i];
} printf("%d\n",ans);
}
return 0;
}

最新文章

  1. Android环境配置及运行helloWord案例
  2. js原生ajax请求get post笔记
  3. make the innerText in the html element can not be selected
  4. 转载:HttpClient使用详解
  5. URAL 2040 (回文自动机)
  6. 集合判断null
  7. Python 2.7 Exception格式化工具
  8. 重新认识JavaScript里的数据类型
  9. django之第二天
  10. Java对正则表达式的支持(二)
  11. Delphi中DataSet和JSON的互转
  12. 删除U8中单据已经审核完成但工作流未完成的任务
  13. 通过项目逐步深入了解Mybatis&lt;二&gt;
  14. hadoop 文件合并
  15. Unity Shader学习资料
  16. javascript变量声明及作用域总结
  17. CF特征码遍历
  18. MySQL 报错
  19. BZOJ 3123 【SDOI2013】 森林
  20. DP--HDU 1003(最大子串和)

热门文章

  1. 【Cocos2d-x】Mac 在 Cocos2d-x 3.X 打包Android
  2. Session小案例------完成用户登录
  3. Oracle生成查询包括对应于所有数据表记录语句中指定的字段名
  4. c# 在cmd中用 7z解压缩文件
  5. 也可以看看GCD(杭州电2504)(gcd)
  6. A星寻路lua实现
  7. T-SQL技术收集——删除重复数据
  8. 将android界面背景设置为黑色
  9. Data source rejected establishment of connection, message from server: &amp;quot;Too many connections&amp;quot;
  10. iOS第三方库