修路 BZOJ 4774
修路
【问题描述】
【输入格式】
【输出格式】
【样例输入】
10 20 1
6 5 1
6 9 4
9 4 2
9 4 10
6 1 2
2 3 6
7 6 10
5 7 1
9 7 2
5 9 10
1 6 8
4 7 4
5 7 1
2 6 9
10 10 6
8 7 2
10 9 10
1 2 4
10 1 8
9 9 7
【样例输出】
8
【数据范围】
题解:
考虑到d灰常小,就是斯坦纳树啦
用斯坦纳树求出以u为根,连通情况为opt的最小价值,记为f[u][opt]
由于题目只要 i 与 n - i + 1 连通,那么取出所有对称的opt,取最小值,记为ans[opt]
再暴力Dp合并
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
using namespace std;
inline void Scan(int &x)
{
char c;
while((c = getchar()) < '' || c > '');
x = c - '';
while((c = getchar()) >= '' && c <= '') x = x * + c - '';
}
const int maxn = ;
const int inf = ;
int n, m, d, t, w;
int num, all;
bool vis[maxn];
int ans[], que[maxn];
int f[maxn][];
int tot, nex[maxn], fir[maxn], ver[maxn], pri[maxn];
inline void Ins(int x, int y, int z)
{
nex[++tot] = fir[x];
fir[x] = tot;
ver[tot] = y;
pri[tot] = z;
}
inline void Reset()
{
memset(f, / , sizeof(f));
for(int i = ; i <= d; ++i) f[i][ << num++] = ;
for(int i = n - d + ; i <= n; ++i) f[i][ << num++] = ;
all = << num;
}
inline void Spfa(int opt)
{
t = ;
while(t < w)
{
int u = que[++t];
for(int i = fir[u]; i; i = nex[i])
{
int v = ver[i];
if(f[u][opt] + pri[i] < f[v][opt])
{
f[v][opt] = f[u][opt] + pri[i];
if(!vis[v])
{
vis[v] = true;
que[++w] = v;
}
}
}
vis[u] = false;
}
}
int main()
{
Scan(n), Scan(m), Scan(d);
int x, y, z;
for(int i = ; i <= m; ++i)
{
Scan(x), Scan(y), Scan(z);
Ins(x, y, z), Ins(y, x, z);
}
Reset();
for(int opt = ; opt < all; ++opt)
{
w = ;
for(int i = ; i <= n; ++i)
{
for(int sub = opt; sub; sub = (sub - ) & opt)
f[i][opt] = min(f[i][opt], f[i][sub] + f[i][opt ^ sub]);
if(f[i][opt] != inf) que[++w] = i, vis[i] = true;
}
Spfa(opt);
ans[opt] = inf;
}
bool flag;
for(int opt = ; opt < all; ++opt)
{
flag = false;
for(int i = ; i <= d; ++i)
{
bool a = (opt & ( << i)) != ;
bool b = (opt & ( << (d << ) - i - )) != ;
if(a != b)
{
flag = true;
break;
}
}
if(flag) continue;
for(int i = ; i <= n; ++i) ans[opt] = min(ans[opt], f[i][opt]);
}
for(int opt = ; opt < all; ++opt)
for(int sub = opt; sub; sub = (sub - ) & opt)
ans[opt] = min(ans[opt], ans[sub] + ans[opt ^ sub]);
if(ans[all - ] != inf) printf("%d", ans[all - ]);
else printf("-1");
}
修路 BZOJ 4774的更多相关文章
- bzoj 4774: 修路
Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 282 Solved: 132[Submit][Status][Discuss] Descriptio ...
- 【BZOJ4774】修路(动态规划,斯坦纳树)
[BZOJ4774]修路(动态规划,斯坦纳树) 题面 BZOJ 题解 先讲怎么求解最小斯坦纳树. 先明白什么是斯坦纳树. 斯坦纳树可以认为是最小生成树的一般情况.最小生成树是把所有给定点都要加入到联通 ...
- bzoj4774 修路
4774: 修路 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 290 Solved: 137[Submit][Status][Discuss] D ...
- bzoj 1196 公路修建问题
bzoj 1196: [HNOI2006]公路修建问题 Description OI island是一个非常漂亮的岛屿,自开发以来,到这儿来旅游的人很多.然而,由于该岛屿刚刚开发不久,所以那里的交通情 ...
- BZOJ 2127: happiness [最小割]
2127: happiness Time Limit: 51 Sec Memory Limit: 259 MBSubmit: 1815 Solved: 878[Submit][Status][Di ...
- BZOJ 3275: Number
3275: Number Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 874 Solved: 371[Submit][Status][Discus ...
- BZOJ 2879: [Noi2012]美食节
2879: [Noi2012]美食节 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1834 Solved: 969[Submit][Status] ...
- bzoj 4610 Ceiling Functi
bzoj 4610 Ceiling Functi Description bzoj上的描述有问题 给出\(n\)个长度为\(k\)的数列,将每个数列构成一个二叉搜索树,问有多少颗形态不同的树. Inp ...
- BZOJ 题目整理
bzoj 500题纪念 总结一发题目吧,挑几道题整理一下,(方便拖板子) 1039:每条线段与前一条线段之间的长度的比例和夹角不会因平移.旋转.放缩而改变,所以将每条轨迹改为比例和夹角的序列,复制一份 ...
随机推荐
- java 核心技术卷一笔记 6 .2.3 接口 lambda 表达式 内部类
6.2.3 对象克隆 Cloneable 接口,这个接口指示一个类提供了一个安全的clone方法.(稍作了解) 为一个对象引用的变量建立副本时,原变量和副本都是同一个对象的引用,任何一个变量改变都 ...
- NSCopying协议和copy方法
不是所有的对象都支持 copy需要继承NSCopying 协议(实现 copyWithZone: 方法)同样,需要继承NSMutableCopying 协议才可以使用mutableCopy(实现 mu ...
- 编写shellcode的几种姿势
今天开始在做hitcon-training的题目,做到lab2就发现了自己的知识盲区,遇到无法执行shell的情况,需要自己打shellcode执行cat flag 操作 经过一系列的搜索,发现了几种 ...
- servlet多文件上传(带进度条)
需要commons-fileupload-1.3.jar和commons-io-2.4.jar的支持 页面效果:(图片文件都可以) (1)进度标识类 public class UploadStatus ...
- vue-router介绍及简单使用
一.vue-router介绍 vue-router是vue官方提供的一个路由框架,控制页面路由,使用较为方便. 1.路由模式 hash(浏览器环境默认值),使用 URL hash 值来作路由,支持所有 ...
- Hanoi双塔问题
题目描述: 给定A.B.C三根足够长的细柱,在A柱上放有2n个中间有孔的圆盘,共有n个不同的尺寸,每个尺寸都有两个相同的圆盘,注意这两个圆盘是不加区分的(下图为n=3的情形).现要将这些圆盘移到C柱上 ...
- mysql 备份解密脚本
#!/bin/bash #by sk 备份解码脚本 echo "-------------------------------------------------" functio ...
- Handler处理器和自定义Opener
Handler处理器 和 自定义Opener opener是 urllib2.OpenerDirector 的实例,我们之前一直都在使用的urlopen,它是一个特殊的opener(也就是模块帮我们构 ...
- POJ 2486 树形背包DP Apple Tree
设d(u, j, 0)表示在以u为根的子树中至多走k步并且最终返回u,能吃到的最多的苹果. 则有状态转移方程: #include <iostream> #include <cstdi ...
- Action的实现方式
[Pojo方式] 1.概述 Pojo(Plain Ordinary Java Object)称为简单Java类,其实就是一个JavaBean. 2.示例 /** * Pojo类方式实现Action * ...