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_ ...
随机推荐
- dz数据结构
pre_common_admincp_cmenu 后台 首页 | 常用操作管理数据表 字段名 数据类型 默认值 允许非空 自动递增 备注 id smallint(6) unsigned NO 是 ...
- discuz 文档说明
Discuz 文档说明 基于7.0的标准程序,部分与插件无关的文件不作说明 文件颜色说明: 红色:程序核心文件,修改这类文件时千万要注意安全! 橙色:做插件几乎不会用到的文件,大概了解功能就可以了, ...
- Spring AOP教程及实例
1.教程转载==>>:http://blog.csdn.net/wangpeng047/article/details/8556800 2.实例转载==>>:http://bl ...
- PostgreSQL数据库smallint、bigint转到Oracle,要用什么类型替代? 是number么,那长度分别是多少?
个人意见,仅供参考:smallint是有符号或无符号2字节的整数,范围是0-65,536,5位整数bigint是有符号或无符号8字节的整数,范围是0-18,446,744,073,709,551,61 ...
- 《转》python学习(8)元组
转自 http://www.cnblogs.com/BeginMan/p/3156235.html 一.元组特性 1.类似列表,但不可变类型,正因如此,它可以做一个字典的key2.当处理一组对象时,这 ...
- PHP 允许Ajax跨域访问 (Access-Control-Allow-Origin)
Ajax访问php,报错 php顶部加上即可: header("Access-Control-Allow-Origin: *");
- [分享]收集的Linux学习资源
下面是我收集的一些Linux资源,与大家分享.大家共同学习,一起进步. 国内的专业Linux网站(GB) 1. ChinaUnix:http://www.chinaunix.net/ 2. Linux ...
- 微信小程序 --- for循环渲染
循环标签:wx:for <view wx:for="{{['aa','bb','cc']}}"> {{index}} {{item}} </view> 这里 ...
- angularJs初体验,实现双向数据绑定!使用体会:比较爽
使用初体验:ng 双向数据绑定: 最简单的双向数据绑定:(使用默认模块控制) <body ng-app> <input type="text" ng-model= ...
- (贪心)kruskal思想
hdu4313 Matrix Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...