Floyd + 状态DP
Watashi的板子
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int INF = (int) 1e8; int dp[1<<11][11]; //dp[S][v] 表示还需访问的集合为S, 现在在v点 int d[11][11]; int n; void floyd() { 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]); } } void print() { for (int i = 0; i <= n; i++) { for (int j = 0; j <= n; j++) printf("%d ", d[i][j]); puts(""); } } int main() { #ifdef Phantom01 freopen("PKU3311.txt", "r", stdin); #endif // Phantom01 while (scanf("%d", &n)!=EOF) { if (0==n) break; for (int i = 0; i <= n; i++) for (int j = 0; j <= n; j++) scanf("%d", &d[i][j]); // print(); floyd(); // print(); for (int i = 0; i <= n; i++) for (int S = 0; S < (1<<(n+1)); S++) dp[S][i] = INF; dp[(1<<(n+1))-1][0] = 0; for (int S = (1<<(n+1))-2; S >= 0; S--) { for (int v = 0; v <= n; v++) { for (int u = 0; u <= n; u++) { if (!(S&(1<<u))) { if (dp[S][v] < 0) { dp[S][v] = dp[S|(1<<u)][u] + d[v][u]; } else { dp[S][v] = min(dp[S][v], dp[S|(1<<u)][u] + d[v][u]); } } } } } printf("%d\n", dp[0][0]); } return 0; }
PKU 3311 Hie with the Pie 状态DP,布布扣,bubuko.com
PKU 3311 Hie with the Pie 状态DP
原文:http://www.cnblogs.com/Phantom01/p/3684411.html