题目地址:POJ 3311
这题基本可以算是TSP问题,先用floyd预处理出来任意两个间对的最短路,注意是有向边。。。然后定义dp[i][j]表示在i状态下最后一个经过的城市为j的最短时间。然后状压即可。
代码如下:
#include <iostream>
#include <string.h>
#include <math.h>
#include <queue>
#include <algorithm>
#include <stdlib.h>
#include <map>
#include <set>
#include <stdio.h>
using namespace std;
#define LL __int64
#define pi acos(-1.0)
const int mod=100000000;
const int INF=0x3f3f3f3f;
const double eqs=1e-8;
int dp[1<<12][20];
int d[20][20];
void floyd(int n)
{
int i, j, k;
for(k=0; k<=n; k++) {
for(i=0; i<=n; i++) {
for(j=0; j<=n; j++){
d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
}
}
}
}
int main()
{
int n, i, j, tot, last, k, min1;
while(scanf("%d",&n)!=EOF&&n) {
for(i=0; i<=n; i++) {
for(j=0; j<=n; j++) {
scanf("%d",&d[i][j]);
}
}
floyd(n);
tot=1<<n;
memset(dp,INF,sizeof(dp));
for(i=1;i<tot;i++){
for(j=0;j<n;j++){
if(i&(1<<j)){
last=i-(1<<j);
if(!last) {
dp[i][j+1]=d[0][j+1];
continue ;
}
for(k=0;k<n;k++){
if(last&(1<<k)){
dp[i][j+1]=min(dp[i][j+1],dp[last][k+1]+d[k+1][j+1]);
}
}
}
}
}
min1=INF;
for(i=1;i<=n;i++){
dp[tot-1][i]+=d[i][0];
min1=min(min1,dp[tot-1][i]);
}
printf("%d\n",min1);
}
return 0;
}