TPS问题 唯一不同的是不一定只经过一次 所以用Floyd处理下最短距离 其他就一样了。。。
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define INF 0x3f3f3f3f
using namespace std;
const int MAXN = 12;
const int maxs = (1 << MAXN);
int Map[MAXN+10][MAXN+10];
int d[MAXN+10][maxs+10];
int Ans = INF;
int n, st;
int dp(int u, int s)
{
if(s == 0) return Map[u][st];
int &ans = d[u][s];
if(ans > 0) return ans;
ans = INF;
for(int i = 0; i < n; i++)
if(s & (1 << i) && Map[u][i])
ans = min(ans, dp(i, s ^ (1 << i)) + Map[u][i]);
return ans;
}
void Floyd()
{
for(int k = 0; k < n; k++)
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
if(Map[i][j] > Map[i][k] + Map[k][j])
Map[i][j] = Map[i][k] + Map[k][j];
}
int main()
{
while(scanf("%d", &n) == 1 && n)
{
n++;
Ans = INF;
memset(d, 0, sizeof(d));
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
scanf("%d", &Map[i][j]);
Floyd();
int S = (1 << n);
Ans = dp(0, (S-1) ^ (1 << 0));
printf("%d\n", Ans);
}
}