Luogu 4784 [BalticOI 2016 Day2]城市
斯坦纳树复习,我暑假的时候好像写过[JLOI2015]管道连接来着。
设$f_{i, s}$表示以$i$为根,$k$个重要点的连通状态为$s$,($0$代表没有连进最小生成树里面去,$1$代表连进了最小生成树里面去)的最小代价,那么可以写出两种转移。
1、$f_{i, s} = min(f_{i, t} + f_{i, s ^ t})$ $t \in s$。
2、$f_{i, s} = min(f_{j,s} + val(j, i))$ 存在一条边$(j, i)$的权值为$val(j, i)$。
第一种转移我们用枚举子集的技巧实现,第二种转移类似于最短路的三角形不等式,可以用$spfa$和$dijskra$转移。
时间复杂度似乎是$O(2^kmlogm + n3^k)$。
Code:
#include <cstdio>
#include <cstring>
#include <queue>
#include <iostream>
using namespace std;
#define R register
typedef long long ll;
typedef pair <ll, int> pin; const int N = 1e5 + ;
const int M = 4e5 + ;
const int K = ;
const ll inf = 0x3f3f3f3f3f3f3f3f; int n, m, k, a[K], tot = , head[N];
ll f[N][ << K];
bool vis[N];
priority_queue <pin> Q; struct Edge {
int to, nxt, val;
} e[M]; inline void add(int from, int to, int val) {
e[++tot].to = to;
e[tot].val = val;
e[tot].nxt = head[from];
head[from] = tot;
} /*template <typename T>
inline void read(T &X) {
X = 0; char ch = 0; T op = 1;
for(; ch > '9' || ch < '0'; ch = getchar())
if(ch == '-') op = -1;
for(; ch >= '0' && ch <= '9'; ch = getchar())
X = (X << 3) + (X << 1) + ch - 48;
X *= op;
} */ namespace IOread{
const int L = << ; char buffer[L], *S, *T; inline char Getchar() {
if(S == T) {
T = (S = buffer) + fread(buffer, , L, stdin);
if(S == T) return EOF;
}
return *S++;
} template <class T>
inline void read(T &X) {
char ch; T op = ;
for(ch = Getchar(); ch > '' || ch < ''; ch = Getchar())
if(ch == '-') op = -;
for(X = ; ch >= '' && ch <= ''; ch = Getchar())
X = (X << ) + (X << ) + ch - '';
X *= op;
} } using namespace IOread; template <typename T>
inline void chkMin(T &x, T y) {
if(y < x) x = y;
} inline void dij(int s) {
memset(vis, , sizeof(vis));
for(; !Q.empty(); ) {
int x = Q.top().second; Q.pop();
if(vis[x]) continue;
vis[x] = ;
for(int i = head[x]; i; i = e[i].nxt) {
int y = e[i].to;
if(f[y][s] > f[x][s] + e[i].val) {
f[y][s] = f[x][s] + e[i].val;
Q.push(pin(-f[y][s], y));
}
}
}
} int main() {
read(n), read(k), read(m);
memset(f, 0x3f, sizeof(f));
for(R int i = ; i <= k; i++) {
read(a[i]);
f[a[i]][ << (i - )] = 0LL;
}
for(R int i = ; i <= m; i++) {
int x, y, v;
read(x), read(y), read(v);
add(x, y, v), add(y, x, v);
} for(R int s = ; s < ( << k); s++) {
for(R int i = ; i <= n; i++) {
for(R int t = s & (s - ); t; t = (t - ) & s)
chkMin(f[i][s], f[i][t] + f[i][s ^ t]);
if(f[i][s] != inf) Q.push(pin(-f[i][s], i));
}
dij(s);
} ll ans = inf;
for(R int i = ; i <= n; i++)
chkMin(ans, f[i][( << k) - ]); printf("%lld\n", ans);
return ;
}
然而我在$loj$上卡了一面都没卡过去……大常数选手很受打击啊
Luogu 4784 [BalticOI 2016 Day2]城市的更多相关文章
- Luogu P4670 [BalticOI 2011 Day2]Plagiarism 题解
我最近是不是数据结构学傻了啊... 这道题看是1e5,所以复杂度为\(O(nlogn)\)的是完全可以跑过去的,然后看题,要求的对于每个数满足要求的区间的长度之和,我们自然而然的就可以想到用FHQ-T ...
- 2016亚洲城市GDP50强出炉
2017年年1月,中国各省GDP排名,台湾排第6:广东,江苏,山东,浙江,河南,台湾,四川,湖北,河北,湖南,我国台湾地区去年的GDP增长率为1.4%,总量折合人民币约为37329.1亿元,加入全国榜 ...
- 最新!2016中国城市GDP排名出炉
2017年1月20日,国家统计局公布:2016年中国国内生产总值GDP达744127亿元,同比增长6.7%,城市GDP方面:截至1月20日,全国大部分城市的去年经济运行数据已经公布,根据信息汇总,20 ...
- SharePoint 2016 自定义城市和区域字段
前言 最近有这么一个需求,就是用到中国的各种行政区,然后还是三级联动,就琢磨写这么一个字段.然后,觉得挺有意义的,写字段的过程也有点心得,就想到拿到博客里分享给大家,一起看看. 1. 创建字段的解决方 ...
- 1003 NOIP 模拟赛Day2 城市建设
题面不好找放一个吧. Description 描述 在有$N$个地级市的H省,政府为了城市开发建设,决定先修路,后造房子,以吸引外来人员.一开始每个城市中有$b_i$个住户,而在两个城市$u,v$之间 ...
- [Luogu P3295][SCOI 2016]萌萌哒
先说下暴力做法,如果[l1,r1]和[l2,r2]子串相等等价于两个区间内每个数对应相等.那么可以用并查集暴力维护,把对应相等的数的位置维护到同一个集合里去,最后答案其实就是把每个集合可以放的数个数乘 ...
- noip 2016 day2 t1组合数问题
题目描述 组合数表示的是从n个物品中选出m个物品的方案数.举个例子,从(1,2,3) 三个物品中选择两个物品可以有(1,2),(1,3),(2,3)这三种选择方法.根据组合数的定 义,我们可以给出计算 ...
- 【GDOI 2016 Day2】第一题 SigemaGO
题目 分析 拆点连边+spfa. 首先把图分成2lim+1层,也就是每个点拆成2lim+1个点. 如果a和b之间.b和c有一条有向边,那么连边(k,a)-->(k+1,b),(k+1,b)--& ...
- luogu 4331 [BalticOI 2004]Sequence 数字序列
LINK:数字序列 这是一道论文题 我去看了一眼论文鸽的论文. 发现讲的还算能懂.可并堆的操作也讲的比较清晰. 对于这道题首先有一个小trick 我们给a数组全部减去其对应的下标这样我们求出来的b数组 ...
随机推荐
- MyEclipse2014快速配置Spring & Spring Testing, Spring AOP简单使用
1.新建项目 2.右击项目,如图,利用myeclipse自动导入spring 3.在弹出的对话框中一直next到最后,在最后的页面中勾选Spring Testing,完成. 4.在src下的appli ...
- 《DSP using MATLAB》示例Example7.22
代码: h = [1, 2, 3, 4, 3, 2, 1]/15; M = length(h); n = 0:M-1; [Hr, w, a, L] = Hr_Type1(h); a L amax = ...
- LeetCode Design TinyURL
原题链接在这里:https://leetcode.com/problems/design-tinyurl/description/ 题目: How would you design a URL sho ...
- timer用作timestamp及其他
niosii中使用时间戳是很有用的,可以查看代码的执行时间是多少,在使用timestamp的过程中遇到一些问题现在做一下记录. 1.硬件部分构建软核没什么,就加一个timer就行了,加完之后自动获得基 ...
- 【BZOJ2850】巧克力王国 KDtree
[BZOJ2850]巧克力王国 Description 巧克力王国里的巧克力都是由牛奶和可可做成的.但是并不是每一块巧克力都受王国人民的欢迎,因为大家都不喜 欢过于甜的巧克力.对于每一块巧克力,我们设 ...
- Tomcat && Servlet(1)
一.概述 为了让web服务器和web应用程序进行访问交互,servlet是这个交互的标准接口,web服务器必须符合servlet标准,web应用应该实现servlet接口. tomcat是一个符合se ...
- Socket代码
服务器端 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; ...
- if-else 循环嵌套结构
package com.a; import java.util.*; public class Core2 { public static void main(String[] arg ...
- 杂项-公司-百科:伯克希尔·哈撒韦-un
ylbtech-杂项-公司-百科:伯克希尔·哈撒韦 伯克希尔·哈撒韦公司由沃伦·巴菲特(Warren Buffett)创建于1956年,是一家主营保险业务,在其他许多领域也有商业活动的公司.其中最重要 ...
- Java开发进阶技能(附文章引用链接)
一.玩转源码 1.Java+Selenium3方法篇0-如何在Eclipse上查看Selenium源码 (在github上下载源码)