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;
}
bzoj1402 Ticket to Ride 斯坦纳树 + 状压dp的更多相关文章
- 【bzoj4006】[JLOI2015]管道连接 斯坦纳树+状压dp
题目描述 给出一张 $n$ 个点 $m$ 条边的无向图和 $p$ 个特殊点,每个特殊点有一个颜色.要求选出若干条边,使得颜色相同的特殊点在同一个连通块内.输出最小边权和. 输入 第一行包含三个整数 n ...
- bzoj 4006 [JLOI2015]管道连接(斯坦纳树+状压DP)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4006 [题意] 给定n点m边的图,连接边(u,v)需要花费w,问满足使k个点中同颜色的 ...
- bzoj 4006 管道连接 —— 斯坦纳树+状压DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4006 用斯坦纳树求出所有关键点的各种连通情况的代价,把这个作为状压(压的是集合选择情况)的初 ...
- BZOJ4006: [JLOI2015]管道连接(斯坦纳树,状压DP)
Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 1171 Solved: 639[Submit][Status][Discuss] Descripti ...
- BZOJ2595: [Wc2008]游览计划(斯坦纳树,状压DP)
Time Limit: 10 Sec Memory Limit: 256 MBSec Special JudgeSubmit: 2030 Solved: 986[Submit][Status][ ...
- 绿色计算大赛决赛 第二阶段 消息传递(斯坦纳树 状压dp+spfa)
传送门 Description 作为公司老板的你手下有N个员工,其中有M个特殊员工.现在,你有一个消息需要传递给你的特殊员工.因为你的公司业务非常紧张,所以你和员工之间以及员工之间传递消息会造成损失. ...
- hdu4085 Peach Blossom Spring 斯坦纳树,状态dp
(1)集合中元素表示(1<<i), i从0开始 (2)注意dp[i][ss] = min(dp[i][ss], dp[i][rr | s[i]] + dp[i][(ss ^ rr) | s ...
- HDU 4085 Peach Blossom Spring 斯坦纳树 状态压缩DP+SPFA
状态压缩dp+spfa解斯坦纳树 枚举子树的形态 dp[i][j] = min(dp[i][j], dp[i][k]+dp[i][l]) 当中k和l是对j的一个划分 依照边进行松弛 dp[i][j] ...
- 51nod 1673 树有几多愁——虚树+状压DP
题目:http://www.51nod.com/Challenge/Problem.html#!#problemId=1673 建一个虚树. 一种贪心的想法是把较小的值填到叶子上,这样一个小值限制到的 ...
随机推荐
- 20165230 《Java程序设计》实验四 Android程序设计实验报告
20165230 <Java程序设计>实验四 Android程序设计实验报告 一.实验报告封面 课程:Java程序设计 班级:1652班 姓名:田坤烨 学号:20165230 成绩: 指导 ...
- 解决阿里云无法正常使用samba的问题【转】
转自:https://blog.csdn.net/u011949148/article/details/54311288 昨天在阿里云上申请了一个云服务器,系统用的是ubuntu14.04,由于是免费 ...
- Linux内核Ramdisk(initrd)机制【转】
转自:http://www.cnblogs.com/armlinux/archive/2011/03/30/2396827.html 摘要:对于Linux用户来说,Ramdisk并不陌生,可是为什么需 ...
- Framebuffer 驱动学习总结(一) ---- 总体架构及关键结构体
一.Framebuffer 设备驱动总体架构 帧缓冲设备为标准的字符型设备,在Linux中主设备号29,定义在/include/linux/major.h中的FB_MAJOR,次设备号定义帧缓冲的个数 ...
- Microsoft.AspNet.SignalR使用cookie丢失
public void SendGroupMessage(string roomId, string message, string status) { // 调用房间内所有客户端的sendMessa ...
- KVM和远程管理工具virt-manager
kvm在server端的部署(针对rhel6系统,可以构建本地更新源) 注意:如果只是安装管理工具,可以试试直接执行8步骤 1.对服务器实行kvm虚拟化首先需要确认服务器的物理硬件是否支持 cat / ...
- [java笔记]动态数组
private int count;//计数器 private int ary[] = new int [3]; if(count >= ary.length){ //数组动态扩展 int ne ...
- opencv(5)GUI
OpenCV的图形用户界面(Graphical User Interface, GUI)和绘图等相关功能也是很有用的功能,无论是可视化,图像调试还是我们这节要实现的标注任务,都可以有所帮助. 窗口循环 ...
- vim 中替换命令
vi/vim 中可以使用 :s 命令来替换字符串.以前只会使用一种格式来全文替换,今天发现该命令有很多种写法(vi 真是强大啊,还有很多需要学习),记录几种在此,方便以后查询. :s/vivian/s ...
- HBase混布MapReduce集群学习记录
一.准备工作 1.1 部署环境 集群规模大概260多台,TSC10机型,机型参数如下: > 1个8核CPU(E5-2620v4) > 64G内存 > HBA,12*4T SATA,1 ...