hdu 3001 Travelling(状态压缩dp)
2017-09-07 15:58
453 查看
一个点可以走两次,看起来还是有点懵逼的,看题解才知道压缩到三进制,涨知识。
参考题解:http://www.cnblogs.com/martinue/p/5490432.html
dp[S][j]中S表示当前已经访问过的节点集合是S,当前所在顶点为j,dp[S][j]就表示从j出发访问剩余的所有节点的最小花费。
参考题解:http://www.cnblogs.com/martinue/p/5490432.html
dp[S][j]中S表示当前已经访问过的节点集合是S,当前所在顶点为j,dp[S][j]就表示从j出发访问剩余的所有节点的最小花费。
#include <bits/stdc++.h> using namespace std; const int INF = 0x7f7f7f7f; int st[11]; int G[11][11]; int dp[60000][11]; int digit[60000][11]; int n,m; void init() { st[0] = 1; for(int i = 1; i < 11; ++i) st[i] = st[i-1]*3; for(int i = 0; i < st[10]; ++i) { int temp = i; for(int j = 0; j < 10; ++j) { digit[i][j] = temp%3; temp /= 3; } } } int main() { init(); int u,v,w; while(scanf("%d %d",&n,&m) != EOF) { memset(G,0x7f,sizeof(G)); memset(dp,0x7f,sizeof(dp)); while(m--) { scanf("%d %d %d",&u,&v,&w); if(w < G[u-1][v-1]) G[u-1][v-1] = G[v-1][u-1] = w; } for(int i = 0; i < n; ++i) dp[st[i]][i] = 0; int res = INF; for(int j = 0; j < st ; ++j) { bool flag = true; for(int i = 0; i < n; ++i) { if(digit[j][i] == 0) flag = false; if(dp[j][i] != INF) { for(int k = 0; k < n; ++k) { if(G[k][i]!= INF && digit[j][k] != 2) { dp[j+st[k]][k] = min(dp[j+st[k]][k],dp[j][i]+G[k][i]); } } } } if(flag) { for(int i = 0; i < n; ++i) res = min(res,dp[j][i]); } } printf("%d\n",res>=INF?-1:res); } return 0; }
相关文章推荐
- HDU-3001 Travelling(状态压缩DP,3进制) HQG_AC的博客
- hdu 3001 Travelling 3进制状态压缩dp
- HDU 3001 Travelling(状态压缩DP)
- HDU 3001 Travelling (状态压缩DP)
- HDU 3001 Travelling(状态压缩DP)
- HDU 3001 Travelling (状态压缩DP +TSP问题)
- HDU 3001 Travelling (三进制状态压缩 DP)
- HDU 3001 Travelling(状态压缩dp)
- HDU 3001 Travelling (三进制状态压缩 DP)
- HDU 3001 Travelling(DP状态压缩)
- HDU 3001 Travelling(状态压缩dp)
- HDU 3001 Travelling (三进制状态压缩DP+BFS)
- hdu 3001 Travelling//状态压缩DP
- HDU 3001 Travelling 【状态压缩DP】
- hdu 3001 Travelling (状态压缩dp,三进制!)
- HDU 3001 Travelling (状态压缩DP)
- hdu 3001 Travelling (状态压缩dp-----模拟三进制)
- HDU 3001--Travelling(状态压缩+tsp)
- hdu 3001 Travelling 旅行商问题变形 三进制的压缩dp
- hdu 3001(状态压缩dp)