修路 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:每条线段与前一条线段之间的长度的比例和夹角不会因平移.旋转.放缩而改变,所以将每条轨迹改为比例和夹角的序列,复制一份 ...
随机推荐
- 使用javap分析Java的字符串操作
我们看这样一行简单的字符串赋值操作的Java代码. String a = "i042416"; 使用命令行将包含了这行代码的Java类反编译查看其字节码: javap -v con ...
- UVA 1661 Equation (后缀表达式,表达式树,模拟,实现)
题意:给出一个后缀表达式f(x),最多出现一次x,解方程f(x) = 0. 读取的时候用一个栈保存之前的结点,可以得到一颗二叉树,标记出现'X'的路径,先把没有出现'X'的子树算完,由于读取建树的时候 ...
- websocket 入门
什么是websocket WebSocket是HTML5新增的协议,它的目的是在浏览器和服务器之间建立一个不受限的双向通信的通道,比如说,服务器可以在任意时刻发送消息给浏览器. 为什么会出现 webs ...
- shell脚本,alias别名命令用法。
[root@localhost ~]# alias alias cp='cp -i' alias mv='mv -i' alias rm='rm -i' [root@localhost ~]# [ro ...
- vue-cli3.0 生产包去除console.log
目前负责的公众号又迭代了一个版本,之前打生产包,配置总是和测试包搞混,所以使用了vue-cli3.0的环境变量来控制配置. 但是又发现了一个新问题,写代码的过程中写了很多console.log 来调试 ...
- jdk环境变量配置(参考自《疯狂java讲义》)
做个记录,免得每次配环境都要百度 环境变量的配置 path环境变量配置的作用:程序的执行需要使用外部指令javac, 但是javac指令仅仅能在JDK安装目录下的bin目录下使用,因此程序只能写入bi ...
- ubuntu 执行apt-get update报错Failed to fetch
在ubuntu下执行sudo apt-get update时,经常会遇到报错: Err http://security.ubuntu.com precise-security InRelease Er ...
- windons杀死8080进程
1,netstat -aon|findstr "8080" //8080端口号 2,taskkill -PID 2976 -F //2976 ,8080端口号对应的进程号
- Linux下平滑升级nginx
一.升级前准备 1.对nginx的配置文件nginx.conf做备份: 2.新建目录/root/nginx,将安装包和脚本上传到该目录下: 二.平滑升级nginx 1.开始编译新版本的nginx cd ...
- python算法-快速排序
快速排序: 学习快速排序,要先复习下递归: 递归的2个条件: 1. 函数自己调用自己 2.有一个退出的条件 练习:基于递归下一个函数,计算n!并且求出当n等于10的值. n!=n * n-1*…..* ...