给定\(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的更多相关文章

  1. 【bzoj4006】[JLOI2015]管道连接 斯坦纳树+状压dp

    题目描述 给出一张 $n$ 个点 $m$ 条边的无向图和 $p$ 个特殊点,每个特殊点有一个颜色.要求选出若干条边,使得颜色相同的特殊点在同一个连通块内.输出最小边权和. 输入 第一行包含三个整数 n ...

  2. bzoj 4006 [JLOI2015]管道连接(斯坦纳树+状压DP)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4006 [题意] 给定n点m边的图,连接边(u,v)需要花费w,问满足使k个点中同颜色的 ...

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

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

  4. BZOJ4006: [JLOI2015]管道连接(斯坦纳树,状压DP)

    Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 1171  Solved: 639[Submit][Status][Discuss] Descripti ...

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

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

  6. 绿色计算大赛决赛 第二阶段 消息传递(斯坦纳树 状压dp+spfa)

    传送门 Description 作为公司老板的你手下有N个员工,其中有M个特殊员工.现在,你有一个消息需要传递给你的特殊员工.因为你的公司业务非常紧张,所以你和员工之间以及员工之间传递消息会造成损失. ...

  7. 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 ...

  8. 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]  ...

  9. 51nod 1673 树有几多愁——虚树+状压DP

    题目:http://www.51nod.com/Challenge/Problem.html#!#problemId=1673 建一个虚树. 一种贪心的想法是把较小的值填到叶子上,这样一个小值限制到的 ...

随机推荐

  1. PHP autoload自动加载机制

    原文地址: http://www.jb51.net/article/31399.htm 一直不是很明白__autoload()和spl_autoload_register()到底有什么不同,找到了一个 ...

  2. Ubuntu 14.04 + xRDP + Xfce 实现Windows远程桌面连接

    1. 安装xRDP及vncserver sudo apt-get install xrdp sudo apt-get install vnc4server tightvncserver 2. 安装Xf ...

  3. torch.normal(means, std, out=None)

    返回满足正态分布的张量 means和std分别给出均值和标准差

  4. Shell中三种引号的用法及区别

    Linux Shell中有三种引号,分别为双引号(" ").单引号(' ')以及反引号(` `). 其中双引号对字符串中出现的$.''.`和\进行替换:单引号不进行替换,将字符串中 ...

  5. socket相关系统调用的调用流程

    最近一直在读内核网络协议栈源码,这里以ipv4/tcp为例对socket相关系统调用的流程做一个简要整理,这些相关系统调用的内部细节虽然各有不同,但其调用流程则基本一致: 调用流程: (1)系统调用 ...

  6. STM8CubeMx来了

    几年前出来的STM32CubeMx是众多stm32开发者的福音,大大缩短了开发者的开发周期.就在前几天,st官网宣布针对stm8的图形配置工具stm8cube横空出世. 如果你还不知道STM32Cub ...

  7. 两个Bounding Box的IOU计算代码

    Bounding Box的数据结构为(xmin,ymin,xmax,ymax) 输入:box1,box2 输出:IOU值 import numpy as np def iou(box1,box2): ...

  8. bootstrap-fileinput上传文件的插件使用总结----编辑已成功上传过的图片

    http://plugins.krajee.com/file-plugin-methods-demo 具体操作 http://plugins.krajee.com/file-preview-manag ...

  9. 从源码层次分析asterisk如何产生呼叫

    老规矩,看别人是怎么搞的 http://blog.chinaunix.net/uid-14723273-id-1739552.html over...

  10. 利用sys.dm_db_index_physical_stats查看索引碎片等数据

    我们都知道,提高sql server的数据查询速度,最有效的方法,就是为表创建索引,而索引在对数据进行新增,删除,修改的时候,会产生索引碎片,索引碎片多了,就需要重新组织或重新生成索引,以达到索引的最 ...