hdu 4640 Island and study-sister(最短路+状压dp)
来源:互联网 发布:php源码分析弱类型 编辑:程序博客网 时间:2024/09/21 06:21
题目链接:hdu 4640 Island and study-sister
解题思路
用二进制数表示2~n的点是否移动过的状态,
然后是
代码
#include <cstdio>#include <cstring>#include <vector>#include <queue>#include <algorithm>using namespace std;const int maxn = 16;const int maxs = (1<<maxn) + 5;const int inf = 0x3f3f3f3f;typedef pair<int,int> pii;int N, M, W[maxs+5][maxn+2], val[maxs+5];bool used[maxs+5][maxn+2];vector<pii> G[maxn+5];struct Node { int s, v, w; Node (int s = 0, int v = 0, int w = 0): s(s), v(v), w(w) {} bool operator < (const Node& u) const { return w > u.w; }};void presolve() { memset(W, inf, sizeof(W)); memset(used, 0, sizeof(used)); W[0][1] = 0; priority_queue<Node> que; que.push(Node(0, 1, W[0][1])); while (!que.empty()) { Node cur = que.top(); que.pop(); int s = cur.s; int u = cur.v; if (used[s][u]) continue; used[s][u] = true; for (int i = 0; i < G[u].size(); i++) { int v = G[u][i].first; int w = G[u][i].second; int vs = s; if (v > 1) vs |= (1<<(v-2)); if (W[vs][v] > W[s][u] + w) { W[vs][v] = W[s][u] + w; que.push(Node(vs, v, W[vs][v])); } } }}void init () { scanf("%d%d", &N, &M); for (int i = 0; i <= N; i++) G[i].clear(); int u, v, w; for (int i = 0; i < M; i++) { scanf("%d%d%d", &u, &v, &w); G[u].push_back(make_pair(v, w)); G[v].push_back(make_pair(u, w)); } presolve();}int dp[4][maxs+5];int solve (int ed) { memset(dp, inf , sizeof(dp)); dp[0][0] = 0; int as = (1<<(N-1))-1; for (int i = 0; i <= as; i++) { val[i] = inf; for (int j = 1; j <= N; j++) val[i] = min(val[i], W[i][j]); } for (int i = 0; i < 3; i++) { for (int s = 0; s <= as; s++) { if (dp[i][s] == inf) continue; int vs = as ^ s; for (int j = vs; j; j = (j-1)&vs) dp[i+1][j|s] = min(dp[i+1][j|s], max(dp[i][s], val[j])); dp[i+1][s] = min(dp[i+1][s], dp[i][s]); } } int ret = inf; for (int i = 0; i <= as; i++) if ((i&ed) == ed) ret = min(ret, dp[3][i]); if (ret == inf) ret = -1; return ret;}int main () { int cas; scanf("%d", &cas); for (int kcas = 1; kcas <= cas; kcas++) { init(); int s = 0, n, x; scanf("%d", &n); while (n--) { scanf("%d", &x); s |= (1<<(x-2)); } printf("Case %d: %d\n", kcas, solve(s)); } return 0;}
0 0
- hdu 4640 Island and study-sister(最短路+状压dp)
- hdu 4640 Island and study-sister(压缩DP+最短路,5级)
- hdu 4640 Island and study-sister(状态压缩dp)
- hdu 4640 Island and study-sister
- HDU 4640 Island and study-sister(状态压缩DP+路径压缩)经典 旅行商问题
- hdu 4640 Island and study-sister 13多校,难
- HDU 5418 Victor and World(状压dp、最短路)
- HDU 5418 Victor and World(状压dp、floy最短路)
- HDU 4856 Tunnels (最短路+状压DP)
- HDU 3768 Shopping 最短路+状压dp
- HDU 4568 Hunter 最短路+状压DP
- HDU 5418 状压DP + 最短路
- HDU 4568【最短路+状压DP】
- HDU 4284-状压DP+最短路
- HDU - 4568 最短路 + 状压dp
- 状压DP + 最短路 HDU 4856
- hdu 2833 WuKong(最短路 + dp)
- hdu 5418 Victor and World 状态压缩dp spfa最短路 floyed最短路
- sdut 3258 Square Number(山东声第六届ACM程序设计竞赛)
- 网站开发进阶(六)JSP两种声明变量的区别
- MacVim安装与配置
- [c] ★ 宏和函数的区别
- hive sql 执行计划实例2
- hdu 4640 Island and study-sister(最短路+状压dp)
- iOS之MBProgressHUD用法总结
- Spiral Matrix II
- JDBC-实现操作:增、删、改(DML)
- Spring中的字符编码过滤器
- TOJ 1547. To and Fro【栈和队列】
- Intellij IDE 使用集锦(更新中...)
- hdu 4642 Fliping game(博弈)
- 算法性能评估-时间复杂度