题意:
有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;
}