简单题,蓦然回首,第一次做这个题还是看解题报告的状态转移前后写了一个多小时才搞定的,练了这么多题目之后,效果还是很明显的。
ACcode:
#include<cstdio>
#include<cstring>
const int NS=12;
const int INF=1<<30;
int n;
int g[NS][NS];
int dp[1<<NS][NS];
int Min(int a1,int b1)
{
return a1<b1?a1:b1;
}
int main()
{
while (~scanf("%d",&n)&&n)
{
for (int i=0;i<=n;i++)
for (int j=0;j<=n;j++)
scanf("%d",&g[i][j]);
for (int k=0;k<=n;k++)
for (int i=0;i<=n;i++)
for (int j=0;j<=n;j++)
g[i][j]=Min(g[i][j],g[i][k]+g[k][j]);
int lim=1<<(n+1);
for (int i=0;i<lim;i++)
for (int j=0;j<=n;j++)
dp[i][j]=INF;
for (int i=0;i<=n;i++)
dp[1<<i][i]=g[0][i];
for (int i=1;i<lim;i++)
{
for (int j=0;j<=n;j++)
{
if (i&(1<<j))
{
int y=i^(1<<j);
for (int k=0;k<=n;k++)
if (y&(1<<k)&&dp[y][k]<INF)
{
dp[i][j]=Min(dp[i][j],dp[y][k]+g[k][j]);
}
}
}
}
printf("%d\n",dp[lim-1][0]);
}
return 0;
}