题意:
有0~n共n+1个点,任意两点所需时间已知,现在要从0起遍历完1~n之间的所有点再回到0点,求所需的最小时间。
思路:
先用floyd求出任意两点之间的最小时间,再枚举从0出发后的遍历顺序,取最小的时间。
代码:
//poj 3311
//sepNINE
#include <iostream>
#include <algorithm>
using namespace std;
const int maxN=16;
int g[maxN][maxN];
int a[maxN];
int main()
{
int n,i,j,k;
while(scanf("%d",&n)==1&&n){
for(i=0;i<=n;++i)
for(j=0;j<=n;++j)
scanf("%d",&g[i][j]);
for(k=0;k<=n;++k)
for(i=0;i<=n;++i)
for(j=0;j<=n;++j)
g[i][j]=min(g[i][j],g[i][k]+g[k][j]);
int ans=INT_MAX;
for(i=0;i<=n;++i)
a[i]=i;
do{
int sum=0;
for(i=0;i<=n;++i)
sum+=g[a[i]][a[(i+1)%(n+1)]];
ans=min(ans,sum);
}while(next_permutation(a+1,a+n+1));
printf("%d\n",ans);
}
return 0;
}