Luogu2993 FJOI2014 最短路径树问题 最短路树、长链剖分
强行二合一最为致命
第一问直接最短路+$DFS$解决
考虑第二问,与深度相关,可以考虑长链剖分。
设$f_{i,j}$表示长度为$i$,经过边数为$j$时的最大边权和,考虑到每一次从重儿子转移过来的时候,不仅要将$f$数组右移一格,还需要同时加上一个值。显然用线段树等数据结构额外维护是不现实的,我们考虑维护一个影响范围为整个$f_i$的加法标记$tag_i$,将$f_{i,0}$设置为$-tag_i$,每一次上传的时候把标记也一起上传,合并轻儿子、计算答案的时候将这个$tag$加上,就能够做到快速地维护了。
长链剖分代码比点分治还长……
#include<bits/stdc++.h>
#define P pair < int , int >
#define int long long
//This code is written by Itst
using namespace std;
inline int read(){
;
;
char c = getchar();
while(c != EOF && !isdigit(c)){
if(c == '-')
f = ;
c = getchar();
}
while(c != EOF && isdigit(c)){
a = (a << ) + (a << ) + (c ^ ');
c = getchar();
}
return f ? -a : a;
}
;
vector < P > e[MAXN];
struct edge{
int end , upEd , w;
}Ed[MAXN << ];
] , g[MAXN << ] , sz[MAXN] , tag[MAXN] , *dp[MAXN] , *cnt[MAXN];
int *p1 = f , *p2 = g , N , M , K , cntEd , ans , times;
priority_queue < P > q;
bool vis[MAXN];
inline void addEd(int a , int b , int c){
Ed[++cntEd].end = b;
Ed[cntEd].upEd = head[a];
Ed[cntEd].w = c;
head[a] = cntEd;
}
void Dijk(){
q.push(P( , ));
memset(dis , 0x3f , sizeof(dis));
dis[] = ;
while(!q.empty()){
P t = q.top();
q.pop();
if(-t.first > dis[t.second])
continue;
; i < sz[t.second] ; ++i)
if(dis[e[t.second][i].first] > dis[t.second] + e[t.second][i].second){
dis[e[t.second][i].first] = dis[t.second] + e[t.second][i].second;
q.push(P(-dis[e[t.second][i].first] , e[t.second][i].first));
}
}
}
void create(int now){
vis[now] = ;
; i < sz[now] ; ++i)
if(!vis[e[now][i].first] && dis[e[now][i].first] == dis[now] + e[now][i].second){
addEd(now , e[now][i].first , e[now][i].second);
addEd(e[now][i].first , now , e[now][i].second);
create(e[now][i].first);
}
}
void dfs1(int now , int pre){
md[now] = dep[now] = dep[pre] + ;
for(int i = head[now] ; i ; i = Ed[i].upEd)
if(!dep[Ed[i].end]){
dfs1(Ed[i].end , now);
if(md[Ed[i].end] > md[now]){
md[now] = md[Ed[i].end];
son[now] = Ed[i].end;
len[now] = Ed[i].w;
}
}
}
void dfs2(int now){
if(son[now]){
dp[son[now]] = dp[now] + ;
cnt[son[now]] = cnt[now] + ;
dfs2(son[now]);
tag[now] = tag[son[now]] + len[now];
dp[now][] = -tag[now];
}
cnt[now][] = ;
if(ans < dp[now][K] + tag[now]){
ans = dp[now][K] + tag[now];
times = cnt[now][K];
}
else
if(ans == dp[now][K] + tag[now])
times += cnt[now][K];
for(int i = head[now] ; i ; i = Ed[i].upEd)
&& Ed[i].end != son[now]){
dp[Ed[i].end] = p1;
cnt[Ed[i].end] = p2;
p1 += (md[Ed[i].end] - dep[Ed[i].end] + ) << ;
p2 += (md[Ed[i].end] - dep[Ed[i].end] + ) << ;
dfs2(Ed[i].end);
; j <= md[Ed[i].end] - dep[Ed[i].end] && j <= K - ; ++j)
- j)
- j] + Ed[i].w){
ans = tag[Ed[i].end] + dp[Ed[i].end][j] + tag[now] + dp[now][K - - j] + Ed[i].w;
times = cnt[Ed[i].end][j] * cnt[now][K - - j];
}
else
- j] + Ed[i].w)
times += cnt[Ed[i].end][j] * cnt[now][K - - j];
; j <= md[Ed[i].end] - dep[Ed[i].end] + && j <= K ; ++j)
] + tag[Ed[i].end] + Ed[i].w - tag[now]){
dp[now][j] = dp[Ed[i].end][j - ] + tag[Ed[i].end] + Ed[i].w - tag[now];
cnt[now][j] = cnt[Ed[i].end][j - ];
}
else
] + tag[Ed[i].end] + Ed[i].w - tag[now])
cnt[now][j] += cnt[Ed[i].end][j - ];
}
}
signed main(){
#ifndef ONLINE_JUDGE
freopen("2993.in" , "r" , stdin);
//freopen("2993.out" , "w" , stdout);
#endif
N = read();
M = read();
K = read() - ;
; i <= M ; ++i){
int a = read() , b = read() , c = read();
e[a].push_back(P(b , c));
e[b].push_back(P(a , c));
++sz[a];
++sz[b];
}
; i <= N ; ++i)
sort(e[i].begin() , e[i].end());
Dijk();
create();
dfs1( , );
dp[] = p1;
p1 += md[] << ;
cnt[] = p2;
p2 += md[] << ;
dfs2();
cout << ans << ' ' << times;
;
}
Luogu2993 FJOI2014 最短路径树问题 最短路树、长链剖分的更多相关文章
- (持续更新)虚树,KD-Tree,长链剖分,后缀数组,后缀自动机
真的就是讲课两天,吸收一个月呢! \(1.\)虚树 \(2.\)KD-Tree \(3.\)长链剖分 \(4.\)后缀数组 后缀数组 \(5.\)后缀自动机 后缀自动机
- [FJOI2014]最短路径树问题 长链剖分
[FJOI2014]最短路径树问题 LG传送门 B站传送门 长链剖分练手好题. 如果你还不会长链剖分的基本操作,可以看看我的总结. 这题本来出的很没水平,就是dijkstra(反正我是不用SPFA)的 ...
- Bzoj4016/洛谷P2993 [FJOI2014] 最短路径树问题(最短路径问题+长链剖分/点分治)
题面 Bzoj 洛谷 题解 首先把最短路径树建出来(用\(Dijkstra\),没试过\(SPFA\)\(\leftarrow\)它死了),然后问题就变成了一个关于深度的问题,可以用长链剖分做,所以我 ...
- bzoj 4016 [FJOI2014]最短路径树问题(最短路径树+树分治)
4016: [FJOI2014]最短路径树问题 Time Limit: 5 Sec Memory Limit: 512 MBSubmit: 426 Solved: 147[Submit][Stat ...
- BZOJ_4016_[FJOI2014]最短路径树问题_最短路+点分治
BZOJ_4016_[FJOI2014]最短路径树问题_最短路+点分治 Description 给一个包含n个点,m条边的无向连通图.从顶点1出发,往其余所有点分别走一次并返回. 往某一个点走时,选择 ...
- 洛谷 [FJOI2014]最短路径树问题 解题报告
[FJOI2014]最短路径树问题 题目描述 给一个包含\(n\)个点,\(m\)条边的无向连通图.从顶点\(1\)出发,往其余所有点分别走一次并返回. 往某一个点走时,选择总长度最短的路径走.若有多 ...
- [BZOJ4016][FJOI2014]最短路径树问题
[BZOJ4016][FJOI2014]最短路径树问题 试题描述 给一个包含n个点,m条边的无向连通图.从顶点1出发,往其余所有点分别走一次并返回. 往某一个点走时,选择总长度最短的路径走.若有多条长 ...
- [BZOJ4016][FJOI2014]最短路径树问题(dijkstra+点分治)
4016: [FJOI2014]最短路径树问题 Time Limit: 5 Sec Memory Limit: 512 MBSubmit: 1796 Solved: 625[Submit][Sta ...
- 【BZOJ4016】[FJOI2014]最短路径树问题 最短路径树+点分治
[BZOJ4016][FJOI2014]最短路径树问题 Description 给一个包含n个点,m条边的无向连通图.从顶点1出发,往其余所有点分别走一次并返回. 往某一个点走时,选择总长度最短的路径 ...
随机推荐
- docker 安装软件
Docker Docker官方网址: https://docs.docker.com/ 英文地址 Docker中文网址: http://www.docker.org.cn/ 中文地址 Docker是 ...
- 聊聊HTTP gzip压缩与常见的Android网络框架
版权声明: 欢迎转载,但请保留文章原始出处 作者:GavinCT 出处:http://www.cnblogs.com/ct2011/p/5835990.html 进入主题之前,我们先来看一下客户端与服 ...
- fedora 28 安装 wine 运行 uTorrent 解决linux 端,pt 资源下载问题
fedora 28 仓库中,资源比较多.使用 wine 运行windows 程序,可以一定程度上解决软件跨平台问题. 搜索: Last metadata expiration check: :: ag ...
- 代理ARP--善意的欺骗
1. 代理ARP(Proxy ARP)是什么? 顾名思义,它指通过中间设备(通常为Router)代替其他主机响应ARP请求.对于没有配置默认网关的主机想要与其他网络的另一台主机通信时,网关收到源主机的 ...
- Centos7下gogs数据配置迁移
工作需要把测试版的gogs迁移到正式版gogs,顺便记下笔记防止以后需要忘记了 环境: centos7测试版gogs:192.168.1.63 centos7正式版gogs:192.168.0.100 ...
- sql server2014企业版无人值守批处理脚本自动化安装
▲版权声明:本文为博主原创文章,未经博主允许不得转载. SQL Server系列软件是Microsoft 公司推出的关系型数据库管理系统.2014年4月16日于旧金山召开的一场发布会上,微软CEO萨蒂 ...
- 房企大裁员;争议贺建奎;破产阴影下的ofo:4星|《财经》第29期
<财经>2018年第29期 总第546期 旬刊 高水平的财经杂志.本期重要话题有:1:房企大裁员;2:争议贺建奎;3:破产阴影下的ofo; 总体评价4星,非常好. 以下是书中一些内容的摘抄 ...
- 联想笔记本Y7000P安装nvidia,cuda,tensorflow,pytorch
Y7000P电脑环境i7处理器,1060显卡,16g内存,win10家庭版(系统版本号1809),在联想官网升级过bios,所有驱动都是最新.(截止时间点2019年3月1日) python3.5 安装 ...
- Sring容器技术内幕之InstantiationStrategy类介绍
引言 org.springframework.beans.factory.support.InstantiationStrategy负责根据BeanDefinition对象创建一个Bean实例.Spr ...
- python3编写网络爬虫13-Ajax数据爬取
一.Ajax数据爬取 1. 简介:Ajax 全称Asynchronous JavaScript and XML 异步的Javascript和XML. 它不是一门编程语言,而是利用JavaScript在 ...