BZOJ:3832: [Poi2014]Rally
题意:
给出$DAG$,询问删掉哪个点之后最长路径最短
思路:
我们令$f[x]$表示从最远的点到达它的距离,$g[x]$表示它能够到达最远的点的距离
那么对于$(x -> y)$一条边来说,它所在的最长路径就是 $f[x] + 1 + g[y]$
我们按照拓扑序依次删点
我们发现此时删去一个点,那么可能存在的最长的路径是
和它同一层的点所在的路径,以及它前一层的点所在的路径,以及它后一层的点所在的路径
因为它只会影响到它前一层的点和后一层的点
那么我们删去它所有入边的贡献,以及它本身的$g[x]$的贡献
再更新答案后
我们加入它出边的贡献,以及它本身的$f[x]$的贡献
#include <bits/stdc++.h>
using namespace std; #define N 500010
int n, m;
vector <int> G[][N];
int f[N], g[N]; namespace SEG
{
int cnt[N << ], Max[N << ];
void build(int id, int l, int r)
{
cnt[id] = Max[id] = ;
if (l == r)
return;
int mid = (l + r) >> ;
build(id << , l, mid);
build(id << | , mid + , r);
}
void update(int id, int l, int r, int pos, int v)
{
if (pos == ) return;
if (l == r)
{
cnt[id] += v;
if (cnt[id] > ) Max[id] = pos;
else Max[id] = ;
return;
}
int mid = (l + r) >> ;
if (pos <= mid) update(id << , l, mid, pos, v);
else update(id << | , mid + , r, pos, v);
Max[id] = max(Max[id << ], Max[id << | ]);
}
} int id[N], d[][N];
void Toposort()
{
id[] = ;
memset(f, , sizeof f);
memset(g, , sizeof g);
queue <int> q;
for (int i = ; i <= n; ++i)
if (d[][i] == )
q.push(i);
while (!q.empty())
{
int u = q.front(); q.pop();
id[++id[]] = u;
for (int v, it = , len = G[][u].size(); it < len; ++it)
{
v = G[][u][it];
if (--d[][v] == )
{
f[v] = f[u] + ;
q.push(v);
}
}
}
for (int i = ; i <= n; ++i)
if (d[][i] == )
q.push(i);
while (!q.empty())
{
int u = q.front(); q.pop();
for (int v, it = , len = G[][u].size(); it < len; ++it)
{
v = G[][u][it];
if (--d[][v] == )
{
g[v] = g[u] + ;
q.push(v);
}
}
}
} void Run()
{
while (scanf("%d%d", &n, &m) != EOF)
{
for (int i = ; i <= n; ++i)
G[][i].clear(), G[][i].clear();
memset(d, , sizeof d);
SEG::build(, , m);
for (int i = , u, v; i <= m; ++i)
{
scanf("%d%d", &u, &v);
G[][u].push_back(v); ++d[][v];
G[][v].push_back(u); ++d[][u];
}
Toposort();
for (int i = ; i <= n; ++i)
SEG::update(, , m, g[i], );
int Min = (int)1e9, pos = -;
for (int x, i = ; i <= n; ++i)
{
x = id[i];
for (int v, it = , len = G[][x].size(); it < len; ++it)
{
v = G[][x][it];
SEG::update(, , m, f[v] + + g[x], -);
}
SEG::update(, , m, g[x], -);
int now = SEG::Max[];
if (now < Min)
{
Min = now;
pos = x;
}
SEG::update(, , m, f[x], );
for (int v, it = , len = G[][x].size(); it < len; ++it)
{
v = G[][x][it];
SEG::update(, , m, f[x] + + g[v], );
}
}
printf("%d %d\n", pos, Min);
}
} int main()
{
#ifdef LOCAL
freopen("Test.in", "r", stdin);
#endif Run();
return ;
}
BZOJ:3832: [Poi2014]Rally的更多相关文章
- 【BZOJ】3832: [Poi2014]Rally
题意 \(n(2 \le n \le 500000)\)个点\(m(1 \le m \le 1000000)\)条边的有向无环图,找到一个点,使得删掉这个点后剩余图中的最长路径最短. 分析 神题不会做 ...
- 3832: [Poi2014]Rally
3832: [Poi2014]Rally 链接 分析: 首先可以考虑删除掉一个点后,计算最长路. 设$f[i]$表示从起点到i的最长路,$g[i]$表示从i出发到终点的最长路.那么经过一条边的最长路就 ...
- BZOJ 3832: [Poi2014]Rally
Sol 线段树+拓扑序. 先把图的拓扑序搞出来,然后统计从起点到该点最长链,从该点到终点的最长链,然后建个起点终点,这里跟网络流很像,把它统一到一个有起点的图中,这里也要注意下细节处理.S,T的一个边 ...
- 【BZOJ3832】[POI2014]Rally(拓扑排序,动态规划)
[BZOJ3832][POI2014]Rally(拓扑排序,动态规划) 题面 BZOJ,权限题 洛谷 题解 这题好强啊,感觉学了好多东西似的. 首先发现了一个图画的很好的博客,戳这里 然后我来补充一下 ...
- BZOJ:3441 乌鸦喝水
bzoj:3441 乌鸦喝水 题目传送门 Description 一只乌鸦在自娱自乐,它在面前放了n个有魔力的水缸,水缸里装有无限的水. 他准备从第1个水缸飞到第n个水缸,共m次.在飞过一个水缸的过程 ...
- 【BZOJ】3835: [Poi2014]Supercomputer
题意 \(n(1 \le 1000000)\)个点的有根树,\(1\)号点为根,\(q(1 \le 1000000)\)次询问,每次给一个\(k\),每一次可以选择\(k\)个未访问的点,且父亲是访问 ...
- 【BZOJ】3834: [Poi2014]Solar Panels
http://www.lydsy.com/JudgeOnline/problem.php?id=3834 题意:求$max\{(i,j)\}, smin<=i<=smax, wmin< ...
- BZOJ3832[Poi2014]Rally——权值线段树+拓扑排序
题目描述 An annual bicycle rally will soon begin in Byteburg. The bikers of Byteburg are natural long di ...
- [POI2014]Rally
OJ题号:BZOJ3832.洛谷3573 思路: 建立超级源汇$S$和$T$,DP求出分别以$S$和$T$为源点的最长路$diss$和$dist$. 对于每条边$i$,设定一个权值$w_i=diss_ ...
随机推荐
- url重写(urlrewrite)的一些系统变量
学php也有3年了,一直对url重写不是很了解,本学用到的话都是百度一下,再复制作简单修改,一些变量的参数都不太了解什么意思,难得今天有时间,做个笔记吧! 1)可用的一些系统变量,在重写条件和重写规则 ...
- EasyUI 每页展示100条数据
$(function() { //$("#bgAddTime").datebox("setValue", getTimeString()+" 00:0 ...
- ubuntu系统无eth0网卡解决办法
ubuntu终端下命令ifconfig的问题解决 问题一. ifconfig之后只显示lo,没有看到eth0 问题二. ifconfig之后显示eth0,但是没有显示静态IP地址,即无inet.地址. ...
- 在navicat中新建数据库
前言: 在本地新建一个名为editor的数据库: 过程: 1.: 2.选择:utf8mb4 -- UTF-8 Unicode字符集,原因在于:utf8mb4兼容utf8,且比utf8能表示更多的字符. ...
- mysql触发器的实战经验-不错的文章
1 引言 Mysql的触发器和存储过程一样,都是嵌入到mysql的一段程序.触发器是mysql5新增的功能,目前线上凤巢系统.北斗系统以及哥伦布系统使用的数据库均是mysql5.0.45版本,很多 ...
- 使用ASIHTTPRequest xcode编译提示找不到"libxml/HTMLparser.h"
使用ASIHTTPRequest xcode编译提示找不到"libxml/HTMLparser.h",解决方法如下: 1>.在xcode中左边选中项目的root节点,在中间编 ...
- MongoDb Mmap引擎分析
版权声明:本文由孔德雨原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/137 来源:腾云阁 https://www.qclo ...
- 教主泡嫦娥[有趣的dp状态设计]
P1342 教主泡嫦娥 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 2012年12月21日下午3点14分35秒,全世界各国的总统以及领导人都已经汇聚在中国 ...
- android通过数组,流播放声音的方法,音频实时传输
AudioRecord和AudioTrack类是Android获取和播放音频流的重要类,放置在android.media包中.与该包中 的MediaRecorder和MediaPlayer类不同,Au ...
- Unity3D 笔记一 初始Unity3D
一.初步认识Unity 1.Unity支持C#.JavaScript.Boo,JavaScript不是标准语法,常称为UnityScript更合适 2.Update 每一帧都会调用该方法.Start. ...