bzoj1402 Ticket to Ride 斯坦纳树 + 状压dp
给定\(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相关推荐
- bzoj 4006 管道连接 —— 斯坦纳树+状压DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4006 用斯坦纳树求出所有关键点的各种连通情况的代价,把这个作为状压(压的是集合选择情况)的初 ...
- BZOJ2595: [Wc2008]游览计划(斯坦纳树,状压DP)
Time Limit: 10 Sec Memory Limit: 256 MBSec Special Judge Submit: 2030 Solved: 986 [Submit][Status ...
- [bzoj4006][JLOI2015]管道连接_斯坦纳树_状压dp
管道连接 bzoj-4006 JLOI-2015 题目大意:给定一张$n$个节点$m$条边的带边权无向图.并且给定$p$个重要节点,每个重要节点都有一个颜色.求一个边权和最小的边集使得颜色相同的重要节 ...
- 【BZOJ 2595】2595: [Wc2008]游览计划 (状压DP+spfa,斯坦纳树?)
2595: [Wc2008]游览计划 Time Limit: 10 Sec Memory Limit: 256 MBSec Special Judge Submit: 1572 Solved: ...
- BZOJ 4006 Luogu P3264 [JLOI2015]管道连接 (斯坦纳树、状压DP)
题目链接: (bzoj)https://www.lydsy.com/JudgeOnline/problem.php?id=4006 (luogu)https://www.luogu.org/probl ...
- 业界萌新对斯坦纳树的小结
业界萌新对斯坦纳树的小结 0.简介 斯坦纳树问题是组合优化问题,与最小生成树相似,是最短网络的一种.最小生成树是在给定的点集和边中寻求最短网络使所有点连通.而最小斯坦纳树允许在给定点外增加额外的点,使 ...
- [学习笔记]斯坦纳树
处理一种这样的问题: 斯坦纳树问题是组合优化问题,与最小生成树相似,是最短网络的一种.最小生成树是在给定的点集和边中寻求最短网络使所有点连通.而最小斯坦纳树允许在给定点外增加额外的点,使生成的最短网络 ...
- [THUSC2017][斯坦纳树+随机化]巧克力
题面 [题目描述] "人生就像一盒巧克力,你永远不知道吃到的下一块是什么味道." 明明收到了一大块巧克力,里面有若干小块,排成 n n n行 m m m列.每一小块都有自己特别的图 ...
- 【算法竞赛学习笔记】超好懂的斯坦纳树详解!!!
title : 斯坦纳树 tags : ACM 图论 date : 2021-6-26 author : Linno 什么是斯坦纳树 给定 n 个点 A1,A2,⋯,An试求连接此n个点,总长最短的直 ...
最新文章
- java,js,jstl,EL的简单交互
- Java笔试面试总结—try、catch、finally语句中有return 的各类情况
- vue+elementui项目打包后样式变化问题
- Sublime使用的插件和快捷键
- python 笔记 之 sqlalchemy操作数据库-创建表
- jquery中this与$(this)的用法区别.
- Linux系统的磁盘管理
- libcurl 域名解析分析
- linux文件系统pdf_一篇文章理解Ext4文件系统的目录
- 点击事件调用匿名函数如何传参_事件发布/订阅模式的简单实现
- 【Linux环境】简单Shell脚本实现定时备份文件、压缩、删除超时文件操作(showDoc文件备份脚本举例)
- canvas 五子棋游戏
- python标准化输出
- Shape Correspondence and Functional Maps
- 突然情怀就上来啦,‘闭包’ 今天咱们讲一下子
- iOS比较两张图的相似度
- VMware虚拟机操作汇总
- Java最新学习笔记(2020版)丨基于JKD1.8
- java 调用弗雷_JAVA 学习笔记
- 慢牛股票-基于Sencha touch+Cordova的股票类APP