bzoj4006
斯坦纳树
比之前要求高了一些
其实利用斯坦纳树的dp[i][s]以i为根,S为状态就行了,先跑一遍斯坦纳树,预处理出dp数组,记住每个S的最小值,然后再dp,这里dp必须要求同一种颜色的状态都必须在S里,然后跑枚举子集就行了
#include<bits/stdc++.h>
using namespace std;
const int N = , inf = 0x3f3f3f3f;
struct edge {
int nxt, to, w;
} e[N * ];
struct points {
int x, c;
} a[N];
int n, m, p, cnt = ;
int head[N], sum[], vis[N], ans[ << ], dp[N][ << ], tmp[];
bool check(int S)
{
memset(tmp, , sizeof(tmp));
for(int i = ; i < p; ++i) if(S >> i & ) ++tmp[a[i].c];
for(int i = ; i <= p; ++i) if(tmp[i] && sum[i] != tmp[i]) return false;
return true;
}
void link(int u, int v, int w)
{
e[++cnt].nxt = head[u];
head[u] = cnt;
e[cnt].to = v;
e[cnt].w = w;
}
int main()
{
scanf("%d%d%d", &n, &m, &p);
for(int i = ; i <= m; ++i)
{
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
link(u, v, w);
link(v, u, w);
}
memset(dp, 0x3f3f, sizeof(dp));
for(int i = ; i < p; ++i)
{
scanf("%d%d", &a[i].c, &a[i].x);
dp[a[i].x][ << i] = ;
++sum[a[i].c];
}
for(int S = ; S < ( << p); ++S)
{
queue<int> q;
for(int i = ; i <= n; ++i)
{
for(int S0 = S; S0; S0 = (S0 - ) & S)
dp[i][S] = min(dp[i][S], dp[i][S ^ S0] + dp[i][S0]);
if(dp[i][S] < inf)
{
vis[i] = ;
q.push(i);
}
}
while(!q.empty())
{
int u = q.front();
q.pop();
vis[u] = ;
for(int i = head[u]; i; i = e[i].nxt) if(dp[u][S] + e[i].w < dp[e[i].to][S])
{
dp[e[i].to][S] = dp[u][S] + e[i].w;
if(!vis[e[i].to])
{
vis[e[i].to] = ;
q.push(e[i].to);
}
}
}
ans[S] = inf;
for(int i = ; i <= n; ++i) ans[S] = min(ans[S], dp[i][S]);
}
for(int i = ; i < ( << p); ++i)
if(check(i))
for(int S = i; S; S = (S - ) & i)
if(check(S))
ans[i] = min(ans[i], ans[i ^ S] + ans[S]);
printf("%d\n", ans[( << p) - ]);
return ;
}
bzoj4006的更多相关文章
- [bzoj4006][JLOI2015]管道连接_斯坦纳树_状压dp
管道连接 bzoj-4006 JLOI-2015 题目大意:给定一张$n$个节点$m$条边的带边权无向图.并且给定$p$个重要节点,每个重要节点都有一个颜色.求一个边权和最小的边集使得颜色相同的重要节 ...
- BZOJ4006 [JLOI2015]管道连接
裸的状压DP 令$f_S$表示包含颜色集合S的最小斯坦纳生成森林的值,于是有: $$f_S=\min\{f_S,f_s+f_{S-s}|s\subset S\}$$ 然后嘛...还是裸的斯坦纳树搞搞. ...
- BZOJ4006 JLOI2015 管道连接(斯坦纳树生成森林)
4006: [JLOI2015]管道连接 Time Limit: 30 Sec Memory Limit: 128 MB Description 小铭铭最近进入了某情报部门,该部门正在被如何建立安全的 ...
- BZOJ4006: [JLOI2015]管道连接(斯坦纳树,状压DP)
Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 1171 Solved: 639[Submit][Status][Discuss] Descripti ...
- 【BZOJ4006】管道连接(动态规划,斯坦纳树)
题面 BZOJ 洛谷 题解 和这题区别不是很大吧. 基本上拿过来改一下就做完了. #include<iostream> #include<cstdio> #include< ...
- 【BZOJ4006】【JLOI2015】管道连接
Description 传送门 Solution 题目要求相同颜色的点必须在一个连通块中,但会有多个颜色同属一个连通块使得解更优的情况. 想一想DP能否行得通:设\(g_i\)表示已考虑颜色状态为\( ...
- 【bzoj4006】[JLOI2015]管道连接 斯坦纳树+状压dp
题目描述 给出一张 $n$ 个点 $m$ 条边的无向图和 $p$ 个特殊点,每个特殊点有一个颜色.要求选出若干条边,使得颜色相同的特殊点在同一个连通块内.输出最小边权和. 输入 第一行包含三个整数 n ...
- [BZOJ4006][JLOI2015]管道连接 状压dp+斯坦纳树
4006: [JLOI2015]管道连接 Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 1020 Solved: 552[Submit][Statu ...
- 【bzoj4006】[JLOI2015]管道连接(斯坦纳树+dp)
题目链接 题意: 给出\(n\)个点,\(m\)条边,同时给出\(p\)个重要的点以及对应特征. 现在要选出一些边,问使得这\(p\)个所有特征相同的点相连,问最小代价. 思路: 斯坦纳树的应用场景一 ...
随机推荐
- mysql: expire_logs_days设置后无效问题
Sina blog - MySQL的 expire_logs_days 和 PURGE MASTER LOGS 无效问题
- Redux作用
作用:Redux是为了解决React中组件与组件之间数据传递的问题. React组件之间的传递有三种情况:1.父组件传递数据给子组件:由于redux是一个单向数据流的框架,所以它的数据就只能由父组件传 ...
- python datetime获取几分钟、小时、天之前的时间
import datetime print ((datetime.datetime.now()-datetime.timedelta(days=1)).strftime("%Y-%m-%d ...
- 基于Redis缓存的Session共享测试(转)
本机ip为192.168.1.101 1.准备测试环境 两个Tomcat 在Eclipse中新建2个Servers,指定对应的Tomcat,端口号错开. Tomcat1(18005.18080.180 ...
- 基于flask做权限控制
和Django实现的原理类似,有时间补充
- kubernetes之故障排查和节点维护(二)
系列目录 案例现场: 测试环境集群本来正常,突然间歇性地出现服务不能正常访问,过一会儿刷新页面又可以正常访问了.进入到服务所在的pod查看输出日志并没有发现异常.使用kubectl get node命 ...
- 将Ubuntu主文件夹里的中文文件夹名称改成英文
方法一: 首先修改现有主文件夹下各文件夹名称: Desktop. Documents. Download. Music. Pictures. Public. Templates. Videos …… ...
- 怎么将linux的动态IP设置成静态IP
例如我的eth0网卡信息如下 eth0 Link encap:Ethernet HWaddr :0C::AA:B2:CA inet addr:192.168.79.135 Bcast:192.168. ...
- Srvctl命令具体解释(10g)
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/lovedieya/article/details/28169481 Srvctl命令 Srvct ...
- jQuery remove()与jQuery empty()的区别
jQuery remove() 方法删除被选元素及其子元素.举例如下: <!DOCTYPE html> <html> <head> <script src=& ...