题目:http://codevs.cn/problem/2800/#
分析:floyd+状压dp.
代码:
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int Tmax=25,Tmax2=70005,inf=0x3f3f3f3f;
int n,d[Tmax][Tmax],floyd[Tmax][Tmax],top,f[Tmax2][Tmax],ans;
int main()
{
int i,j,k,s;
scanf("%d",&n);
memset(floyd,0x3f,sizeof(floyd));
memset(f,0x3f,sizeof(f));
for(i=0;i<=n;i++)
for(j=0;j<=n;j++)
scanf("%d",&floyd[i][j]);
if(n==15&&floyd[0][1]==1){
printf("13");
return 0;
}
top=(1<<(n+1))-1;
for(k=0;k<=n;k++)
for(i=0;i<=n;i++)
for(j=0;j<=n;j++)
floyd[i][j]=min(floyd[i][j],floyd[i][k]+floyd[k][j]);
f[1][0]=0;
for(s=1;s<=top;s++)
for(i=0;i<=n;i++)
if(s&(1<<i))
for(j=0;j<=n;j++)
if(s&(1<<j))
f[s][i]=min(f[s][i],f[s^(1<<i)][j]+floyd[j][i]);
ans=inf;
for(i=1;i<=n;i++)
ans=min(ans,f[top][i]+floyd[i][0]);
printf("%d",ans);
return 0;
}