博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
计蒜客 宝藏 (状压DP)
阅读量:6902 次
发布时间:2019-06-27

本文共 2091 字,大约阅读时间需要 6 分钟。


链接 :

思路 :

  • 状压DP. 开始想直接爆搜, T掉了, 然后就采用了状压DP的方法来做.

  • 定义$f[S]$为集合$S$的最小代价, $dis[i]$则记录第$i$个点的"深度", 所以说边$E{[i, j]}$ 的工程代价就为$dis[i] * E{[i, j]}$, 因此可以得到状态转移方程 :

    • 初始状态(假设以$i$作为起点) :
      • $dis[i] = 1$, $f[1 << (i - 1)] = 0$,
      • $dis[k] = INF (k != i, k = 1, 2, 3 ...)$, $f[k] = INF (k != (1 << (i - 1)), k = 1, 2, ... , (1 << n) - 1)$
    • 对于中间状态$j$ :
      • $f[S | 1 << (j - 1)] = min(f[S | 1 << (j - 1)], f[S] + E[i][j] * dis[i])$
      • $dis[j] = dis[i] + 1$
  • 大犇说, 状压为什么快, 是因为在读取数据的时候比普通数组要快... 所以说, 我还是不太理解...为什么快, QAQ, 大犇还说, 世界上总有这么一群人, 你们俩算法复杂度一样, 但他就是比你快几百倍... em....

代码 :

#include 
#include
using namespace std;#define MAX_N 15const int INF = 0x7FFFFFFF;int E[MAX_N][MAX_N];int dis[MAX_N], f[1 << MAX_N];int n, m;void init() { for (int i = 1 ; i <= n ; ++i) { for (int j = 1 ; j <= n ; ++j) { E[i][j] = INF; } }}void read() { scanf("%d%d", &n, &m); init(); for (int i = 0 ; i < m ; ++i) { int u, v, w; scanf("%d%d%d", &u, &v, &w); E[u][v] = min(E[u][v], w); E[v][u] = min(E[v][u], w); }}void find(int S) { for (int i = 1 ; i <= n ; ++i) { if (!((1 << (i - 1)) & S)) continue; for (int j = 1 ; j <= n ; ++j) { // if (!((1 << (j - 1) & S) == 0 && E[i][j] != INF)) continue; if (!(!(1 << (j - 1) & S) && E[i][j] != INF)) continue; if (f[S | (1 << (j - 1))] <= f[S] + dis[i] * E[i][j]) continue; f[S | (1 << (j - 1))] = f[S] + dis[i] * E[i][j]; int t_dis = dis[j]; dis[j] = dis[i] + 1; find(S | (1 << (j - 1))); dis[j] = t_dis; } }}void solve() { int ans = INF; for (int i = 1 ; i <= n ; ++i) { for (int j = 1 ; j <= n ; ++j) dis[j] = INF; for (int j = 1 ; j <= (1 << n) - 1 ; ++j) f[j] = INF; dis[i] = 1; f[1 << (i - 1)] = 0; find(1 << (i - 1)); ans = min(ans, f[(1 << n) - 1]); } printf("%d\n", ans);}int main() { read(); solve(); return 0;}

转载于:https://www.cnblogs.com/WArobot/p/7883676.html

你可能感兴趣的文章
mtr命令
查看>>
我的友情链接
查看>>
运维工程师总结
查看>>
在 Ubuntu 中用 Docker 管理 Linux Container 容器
查看>>
我的友情链接
查看>>
jquery自定义滚动条-->mCustomScrollbar
查看>>
快讯|阿里云•云市场爆款推荐,千款软件任您选
查看>>
七周五次课(5月10日)
查看>>
我的友情链接
查看>>
华为QuidWay交换机配置命令手册 Part 1
查看>>
Nginx下https配置
查看>>
开发函数计算的正确姿势——使用 brotli 压缩大文件
查看>>
论程序员的自我修养——我在阿里干了十年开发
查看>>
nginx 详解
查看>>
我的友情链接
查看>>
浅谈精准数据库营销
查看>>
巨头为何纷推智能手机OS?
查看>>
postgresql 全文搜索
查看>>
Windows Server 2012 R2 要远程登录,你需要具有通过远程桌面服务进行登录的权限...
查看>>
linux第一关考试题
查看>>