题目地址: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; }
POJ 3311 Hie with the Pie (状压DP)
原文地址:http://blog.csdn.net/scf0920/article/details/42583839