题目:
题解:
这道题好像有点眼熟?旅游景点?
需要预处理任意两个城市间的最短距离
codevs从崩—修复
有个数据是错的?只给了一个n*n的矩阵?这竟意味着我的dis不能memset…(ta都给你数字了啊你memset个什么劲
代码:
#include <cstdio>
#include <iostream>
#include <cstring>
#define INF 1e9
using namespace std;
int dis[20][20],f[1<<17][20];
int main()
{
int n,i,j,k;
scanf("%d",&n);
for (i=1;i<=n+1;i++)
for (j=1;j<=n+1;j++)
scanf("%d",&dis[i][j]);
for (k=1;k<=n+1;k++)
for (i=1;i<=n+1;i++)
for (j=1;j<=n+1;j++)
if (i!=j && j!=k)
dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
int tot=(1<<n)-1;
//f[i][j]表示状态为i停留在j
memset(f,-1,sizeof(f));
f[0][1]=0;
for (i=0;i<=tot;i++)
for (j=1;j<=n+1;j++)
if (f[i][j]!=-1)
for (k=2;k<=n+1;k++)
if (f[i|(1<<k-2)][k]==-1 || f[i|(1<<k-2)][k]>f[i][j]+dis[j][k])
f[i|(1<<k-2)][k]=f[i][j]+dis[j][k];
int ans=INF;
for (i=1;i<=n+1;i++)
if (f[tot][i]+dis[i][1]>0 && f[tot][i]!=-1)
ans=min(ans,f[tot][i]+dis[i][1]);
printf("%d",ans);
}