#include <iostream>
#include<cstdio>
#include<cmath>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=12;
const int inf = 0x3f3f3f3f;
int f[(1<<maxn)][maxn];
int dis[maxn][maxn];
int n;
int main()
{
while(cin>>n && n)
{
int maxs=(1<<(n+1));
memset(dis,0x3f,sizeof dis);
for(int i=0;i<=n;i++)
for(int j=0;j<=n;j++) cin>>dis[i][j];
for(int k=0;k<=n;k++)
for(int i=0;i<=n;i++)
for(int j=0;j<=n;j++)
if(dis[i][j]>dis[i][k]+dis[k][j]) dis[i][j]=dis[i][k]+dis[k][j];
memset(f,0x3f,sizeof f);
for(int i=0;i<=n;i++)
f[(1<<i)][i]=dis[0][i];
//for(int i=0;i<=n;i++) f[(1<<i)][i]=dis[0][i]+dis[i][0];
for(int s=1;s<maxs;s++)
{
for(int j=0;j<=n;j++)
{
if(!(s&(1<<j))) continue;
int news=s^(1<<j);
for(int k=0;k<=n;k++)
{
if(news&(1<<k))
f[s][j]=min(f[s][j],f[news][k]+dis[k][j]);
}
}
}
cout<<f[maxs-1][0]<<endl;
}
return 0;
}
poj3311
最新推荐文章于 2022-08-16 22:05:53 发布
本文介绍了一种使用动态规划解决旅行商问题(TSP)的方法,通过预处理节点间的最短距离并采用状态压缩技巧,实现了对所有可能路径的有效计算,最终找到从起点出发遍历所有节点再返回起点的最短路径。

3301

被折叠的 条评论
为什么被折叠?



