斯坦纳树复习,我暑假的时候好像写过[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]城市的更多相关文章

  1. Luogu P4670 [BalticOI 2011 Day2]Plagiarism 题解

    我最近是不是数据结构学傻了啊... 这道题看是1e5,所以复杂度为\(O(nlogn)\)的是完全可以跑过去的,然后看题,要求的对于每个数满足要求的区间的长度之和,我们自然而然的就可以想到用FHQ-T ...

  2. 2016亚洲城市GDP50强出炉

    2017年年1月,中国各省GDP排名,台湾排第6:广东,江苏,山东,浙江,河南,台湾,四川,湖北,河北,湖南,我国台湾地区去年的GDP增长率为1.4%,总量折合人民币约为37329.1亿元,加入全国榜 ...

  3. 最新!2016中国城市GDP排名出炉

    2017年1月20日,国家统计局公布:2016年中国国内生产总值GDP达744127亿元,同比增长6.7%,城市GDP方面:截至1月20日,全国大部分城市的去年经济运行数据已经公布,根据信息汇总,20 ...

  4. SharePoint 2016 自定义城市和区域字段

    前言 最近有这么一个需求,就是用到中国的各种行政区,然后还是三级联动,就琢磨写这么一个字段.然后,觉得挺有意义的,写字段的过程也有点心得,就想到拿到博客里分享给大家,一起看看. 1. 创建字段的解决方 ...

  5. 1003 NOIP 模拟赛Day2 城市建设

    题面不好找放一个吧. Description 描述 在有$N$个地级市的H省,政府为了城市开发建设,决定先修路,后造房子,以吸引外来人员.一开始每个城市中有$b_i$个住户,而在两个城市$u,v$之间 ...

  6. [Luogu P3295][SCOI 2016]萌萌哒

    先说下暴力做法,如果[l1,r1]和[l2,r2]子串相等等价于两个区间内每个数对应相等.那么可以用并查集暴力维护,把对应相等的数的位置维护到同一个集合里去,最后答案其实就是把每个集合可以放的数个数乘 ...

  7. noip 2016 day2 t1组合数问题

    题目描述 组合数表示的是从n个物品中选出m个物品的方案数.举个例子,从(1,2,3) 三个物品中选择两个物品可以有(1,2),(1,3),(2,3)这三种选择方法.根据组合数的定 义,我们可以给出计算 ...

  8. 【GDOI 2016 Day2】第一题 SigemaGO

    题目 分析 拆点连边+spfa. 首先把图分成2lim+1层,也就是每个点拆成2lim+1个点. 如果a和b之间.b和c有一条有向边,那么连边(k,a)-->(k+1,b),(k+1,b)--& ...

  9. luogu 4331 [BalticOI 2004]Sequence 数字序列

    LINK:数字序列 这是一道论文题 我去看了一眼论文鸽的论文. 发现讲的还算能懂.可并堆的操作也讲的比较清晰. 对于这道题首先有一个小trick 我们给a数组全部减去其对应的下标这样我们求出来的b数组 ...

随机推荐

  1. SQLite3的运用

    1.导入库文件:libsqlite3. 2..m文件的代码: // // ViewController.m // SQLite3的运用 // // Created by PengYunjing on ...

  2. fn project 对象模型

    Applications At the root of everything are applications. In fn, an application is essentially a grou ...

  3. 7天学会HTML--HTML综述

    一周学会HTML 1.HTML是什么? HTML 指的是超文本标记语言 (Hyper Text Markup Language) 2.HTML发展历程 HTML版本从1.0到4.0不断升级,其版本的规 ...

  4. 解决ubantu中sublime不支持中文的方法

    更新然后将系统升级到最新版本,在linux终端输入 sudo apt-get update && sudo apt-get 在本地目录中克隆此repo:    如果你没有git的话就安 ...

  5. etcd服务端和客户端安装

    下载地址: 服务端:http://download.csdn.net/download/wuxun1997/9841277 客户端:http://download.csdn.net/download/ ...

  6. sublime 工具

    http://blog.csdn.net/admin_yi/article/details/53608965

  7. TCP/IP/HTTP

    一.什么是TCP连接的三次握手 第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认; 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1 ...

  8. Debian上启用Apache2服务

    在Debian上启用Apache2的方法如下: sudo apt-get update sudo apt-get install -y apache2 sudo service apache2 sta ...

  9. Redis官方文档》持久化

    原文链接 译者:Alexandar Mahone 这篇文章从技术层面描述了Redis持久化,建议所有读者阅读.如果希望更多了解Redis持久化和持久性保障,建议阅读Redis持久化揭秘. Redis ...

  10. 有趣的java小项目------猜拳游戏

    package com.aaa; //总结:猜拳游戏主要掌握3个方面:1.人出的动作是从键盘输入的(System.in)2.电脑是随机出的(Random随机数)3.双方都要出(条件判断) import ...