给定\(n\)个点,\(m\)条边的带权无向图

选出一些边,使得\(4\)对点之间可达,询问权值最小为多少

\(n \leqslant 30, m \leqslant 1000\)


首先看数据范围,\(4\)对点,也就是\(8\)个点,很小

上斯坦纳树(局部最小生成树)

然而好像题目并不是斯坦纳树,可能是一些树拼到一起

那么就再做一个状压\(dp\)即可

复杂度\(O(3^8 * n + 2^8 * nm + 2^{12} * n)\)


#include <map>
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;const int sid = 55;
const int eid = (1 << 9) - 1;
inline void cmin(int &a, int b) { if(a > b) a = b; }int n, m, nc;
int U[sid], V[sid], cl[sid], ip[sid];
int f[sid][eid], E[sid][sid];
string s[55], sa, sb;
map <string, int> id;int inq[sid];
queue <int> q;
void spfa(int S) {memset(inq, 0, sizeof(inq));for(int i = 1; i <= n; i ++) q.push(i);while(!q.empty()) {int id = q.front(); q.pop(); inq[id] = 0;for(int j = 1; j <= n; j ++)if(f[j][S] > f[id][S] + E[id][j]) {f[j][S] = f[id][S] + E[id][j];if(!inq[j]) q.push(j), inq[j] = 1;}}
}void wish1() {memset(f, 56, sizeof(f));for(int i = 1; i <= n; i ++)if(cl[i]) {nc ++;ip[i] = nc;f[i][(1 << nc - 1)] = 0;}for(int S = 0; S <= (1 << nc) - 1; S ++) {for(int i = 1; i <= n; i ++)for(int T = S; T; T = (T - 1) & S)cmin(f[i][S], f[i][T] + f[i][S ^ T]);spfa(S);}
}int g[eid];
void wish2() {memset(g, 56, sizeof(g)); g[0] = 0;for(int s = 0; s <= (1 << 4) - 1; s ++)for(int i = 1; i <= n; i ++)for(int S = 0; S <= (1 << nc) - 1; S ++) {int T = 0;for(int k = 1; k <= 4; k ++)if((S & (1 << ip[U[k]] - 1)) && (S & (1 << ip[V[k]] - 1)))T |= (1 << k - 1);cmin(g[s | T], g[s] + f[i][S]);}printf("%d\n", g[(1 << 4) - 1]);
}int main() {freopen("bzoj1402.in", "r", stdin);freopen("bzoj1402.out", "w", stdout);cin >> n >> m;for(int i = 1; i <= n; i ++) {cin >> s[i];id[s[i]] = i;}memset(E, 56, sizeof(E));for(int i = 1; i <= m; i ++) {int u, v, w;cin >> sa >> sb >> w;u = id[sa]; v = id[sb];cmin(E[u][v], w); E[v][u] = E[u][v];}for(int i = 1; i <= 4; i ++) {int u, v;cin >> sa >> sb;u = id[sa]; v = id[sb];U[i] = u; V[i] = v;cl[u] = cl[v] = 1;}wish1(); wish2();return 0;
}

转载于:https://www.cnblogs.com/reverymoon/p/10076783.html

bzoj1402 Ticket to Ride 斯坦纳树 + 状压dp相关推荐

  1. bzoj 4006 管道连接 —— 斯坦纳树+状压DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4006 用斯坦纳树求出所有关键点的各种连通情况的代价,把这个作为状压(压的是集合选择情况)的初 ...

  2. BZOJ2595: [Wc2008]游览计划(斯坦纳树,状压DP)

    Time Limit: 10 Sec  Memory Limit: 256 MBSec  Special Judge Submit: 2030  Solved: 986 [Submit][Status ...

  3. [bzoj4006][JLOI2015]管道连接_斯坦纳树_状压dp

    管道连接 bzoj-4006 JLOI-2015 题目大意:给定一张$n$个节点$m$条边的带边权无向图.并且给定$p$个重要节点,每个重要节点都有一个颜色.求一个边权和最小的边集使得颜色相同的重要节 ...

  4. 【BZOJ 2595】2595: [Wc2008]游览计划 (状压DP+spfa,斯坦纳树?)

    2595: [Wc2008]游览计划 Time Limit: 10 Sec  Memory Limit: 256 MBSec  Special Judge Submit: 1572  Solved:  ...

  5. BZOJ 4006 Luogu P3264 [JLOI2015]管道连接 (斯坦纳树、状压DP)

    题目链接: (bzoj)https://www.lydsy.com/JudgeOnline/problem.php?id=4006 (luogu)https://www.luogu.org/probl ...

  6. 业界萌新对斯坦纳树的小结

    业界萌新对斯坦纳树的小结 0.简介 斯坦纳树问题是组合优化问题,与最小生成树相似,是最短网络的一种.最小生成树是在给定的点集和边中寻求最短网络使所有点连通.而最小斯坦纳树允许在给定点外增加额外的点,使 ...

  7. [学习笔记]斯坦纳树

    处理一种这样的问题: 斯坦纳树问题是组合优化问题,与最小生成树相似,是最短网络的一种.最小生成树是在给定的点集和边中寻求最短网络使所有点连通.而最小斯坦纳树允许在给定点外增加额外的点,使生成的最短网络 ...

  8. [THUSC2017][斯坦纳树+随机化]巧克力

    题面 [题目描述] "人生就像一盒巧克力,你永远不知道吃到的下一块是什么味道." 明明收到了一大块巧克力,里面有若干小块,排成 n n n行 m m m列.每一小块都有自己特别的图 ...

  9. 【算法竞赛学习笔记】超好懂的斯坦纳树详解!!!

    title : 斯坦纳树 tags : ACM 图论 date : 2021-6-26 author : Linno 什么是斯坦纳树 给定 n 个点 A1,A2,⋯,An试求连接此n个点,总长最短的直 ...

最新文章

  1. java,js,jstl,EL的简单交互
  2. Java笔试面试总结—try、catch、finally语句中有return 的各类情况
  3. vue+elementui项目打包后样式变化问题
  4. Sublime使用的插件和快捷键
  5. python 笔记 之 sqlalchemy操作数据库-创建表
  6. jquery中this与$(this)的用法区别.
  7. Linux系统的磁盘管理
  8. libcurl 域名解析分析
  9. linux文件系统pdf_一篇文章理解Ext4文件系统的目录
  10. 点击事件调用匿名函数如何传参_事件发布/订阅模式的简单实现
  11. 【Linux环境】简单Shell脚本实现定时备份文件、压缩、删除超时文件操作(showDoc文件备份脚本举例)
  12. canvas 五子棋游戏
  13. python标准化输出
  14. Shape Correspondence and Functional Maps
  15. 突然情怀就上来啦,‘闭包’ 今天咱们讲一下子
  16. iOS比较两张图的相似度
  17. VMware虚拟机操作汇总
  18. Java最新学习笔记(2020版)丨基于JKD1.8
  19. java 调用弗雷_JAVA 学习笔记
  20. 慢牛股票-基于Sencha touch+Cordova的股票类APP

热门文章

  1. 搭建LAMP环境示例
  2. Selenium Webdriver——操作隐藏的元素(三)switchTo().frame()
  3. win7系统待机模式下如何分配下载方法
  4. Linux—帐号和权限管理
  5. 15分钟学会MyEclipse导出jar文件再装换成exe可执行文件
  6. 我的RHCA之路随想
  7. 196℃到80℃ 安徽首例“康博刀”手术杀灭肿瘤
  8. linux服务器mysql数据库新建数据库并配置数据库用户
  9. day26 re正则表达式
  10. 优秀好文收录(持续更新...)