标签:style blog http io for 2014 sp log on
题目链接:http://poj.org/problem?id=3311
Floyd + 状态压缩DP
题意是有N个城市(1~N)和一个PIZZA店(0),要求一条回路,从0出发,又回到0,而且距离最小。
状态:dp[S][v]表示从v出发访问剩余的所有顶点(集合S),最终回到顶点0的路径的权重总和最小值。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 12;
const int INF = 0x3f3f3f3f;
int d[maxn][maxn];
int dp[1<<maxn][maxn];
int main()
{
int n;
while(~scanf("%d", &n)){
if(n==0) break;
n++;
for(int i=0; i<n; ++i){
for(int j=0; j<n; ++j)
scanf("%d", &d[i][j]);
}
for(int k=0; k<n; ++k)
for(int i=0; i<n; ++i)
for(int j=0; j<n; ++j)
{
d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
}
int S = 1<<n;
for(int i=0; i<S; ++i){
fill(dp[i], dp[i]+n, INF);
}
dp[S-1][0] = 0;
for(int i=S-2; i>=0; --i){
for(int v=0; v<n; ++v){
for(int u=0; u<n; ++u){
if(!(i>>u&1) ){
dp[i][v] = min(dp[i][v], dp[i|1<<u][u]+d[v][u]);
}
}
}
}
printf("%d\n", dp[0][0]);
}
return 0;
}
标签:style blog http io for 2014 sp log on
原文地址:http://blog.csdn.net/yew1eb/article/details/39206621