POI2014 RAJ-Rally
Description
给定一个\(N\)个点\(M\)条边的\(DAG(N,M\leq10^6)\),边权为\(1\)。删去一个点,使剩余图中的最长路径最短,求删去的点和最长路径长度。
Solution
神仙而有趣的一题\(Orz\),可能讲的不是很清楚\(QAQ\)
先求出终点为\(u\)的最长路\(f_u\)和起点为\(u\)的最长路\(g_u\),经过\((u,v)\)边的最长路为\(f_u+g_v+1\),这个可以用建正反图然后拓扑排序得到。
考虑删除\(u\)点,即不经过\(u\)的入边与出边的最长路,暴力就是把所有最长路权值丢到数据结构中,然后每次删除一些权值后统计答案,复杂度\(O(n^2logn)\),难以接受。
考虑\(DAG\)的性质,每一条边\((u->v)\)中\(u\)的拓扑序小于\(v\)。所以考虑按拓扑序处理,处理\(u\)前,把反图的出边相关信息\(pop\),统计答案后把正图的出边相关信息\(push\)。
然后我们需要一个支持\(pop,push\)指定数并求出\(max\)的数据结构,用两个堆(优先队列)就可以做到了。
Code
#include<cstdio>
#include<vector>
#include<queue>
#define rep(i, a, b) for (register int i=(a); i<=(b); ++i)
#define per(i, a, b) for (register int i=(a); i>=(b); --i)
using namespace std;
const int N=500005;
vector<int> G[N], IG[N];
struct Priority_queue
{
priority_queue<int> a, b;
void push(int x){a.push(x);}
void pop(int x){b.push(x);}
int top()
{
while (!b.empty() && a.top()==b.top())
a.pop(), b.pop();
return a.top();
}
}Q;
int deg[N], q[N], f[N], g[N], l, r, ans, pos;
inline int read()
{
int x=0,f=1;char ch=getchar();
for (;ch<'0'||ch>'9';ch=getchar()) if (ch=='-') f=-1;
for (;ch>='0'&&ch<='9';ch=getchar()) x=(x<<1)+(x<<3)+ch-'0';
return x*f;
}
int main()
{
int n=read(), m=read(); ans=m;
rep(i, 1, m)
{
int u=read(), v=read();
G[u].push_back(v); IG[v].push_back(u);
deg[v]++;
}
rep(i, 1, n) if (!deg[i]) q[++r]=i;
while (l<r)
{
int u=q[++l];
for (int v: G[u]) if (!(--deg[v])) q[++r]=v;
}
rep(i, 1, n)
{
int u=q[i];
for (int v: G[u]) f[v]=max(f[v], f[u]+1);
}
per(i, n, 1)
{
int u=q[i];
for (int v: IG[u]) g[v]=max(g[v], g[u]+1);
}
rep(i, 1, n) Q.push(g[i]), Q.push(-1);
rep(i, 1, n)
{
int u=q[i];
for (int v: IG[u]) Q.pop(f[v]+g[u]+1);
Q.pop(g[u]);
if (ans>Q.top()) ans=Q.top(), pos=u;
for (int v: G[u]) Q.push(f[u]+g[v]+1);
Q.push(f[u]);
}
printf("%d %d\n", pos, ans);
return 0;
}
POI2014 RAJ-Rally的更多相关文章
- [POI2014]RAJ(最短路,拓扑排序)
对于一个点 \(x\) 如何求答案? 由于这个图是个有向无环图,可以先拓扑排序一遍,求出每个点的拓扑序,从起点到它的最长路 \(d2\),从它到终点的最长路 \(d1\).(我写代码是这么写的,注意顺 ...
- 【BZOJ3832】[POI2014]Rally(拓扑排序,动态规划)
[BZOJ3832][POI2014]Rally(拓扑排序,动态规划) 题面 BZOJ,权限题 洛谷 题解 这题好强啊,感觉学了好多东西似的. 首先发现了一个图画的很好的博客,戳这里 然后我来补充一下 ...
- 3832: [Poi2014]Rally
3832: [Poi2014]Rally 链接 分析: 首先可以考虑删除掉一个点后,计算最长路. 设$f[i]$表示从起点到i的最长路,$g[i]$表示从i出发到终点的最长路.那么经过一条边的最长路就 ...
- BZOJ3832[Poi2014]Rally——权值线段树+拓扑排序
题目描述 An annual bicycle rally will soon begin in Byteburg. The bikers of Byteburg are natural long di ...
- 【BZOJ】3832: [Poi2014]Rally
题意 \(n(2 \le n \le 500000)\)个点\(m(1 \le m \le 1000000)\)条边的有向无环图,找到一个点,使得删掉这个点后剩余图中的最长路径最短. 分析 神题不会做 ...
- BZOJ 3832: [Poi2014]Rally
Sol 线段树+拓扑序. 先把图的拓扑序搞出来,然后统计从起点到该点最长链,从该点到终点的最长链,然后建个起点终点,这里跟网络流很像,把它统一到一个有起点的图中,这里也要注意下细节处理.S,T的一个边 ...
- BZOJ3832 : [Poi2014]Rally
f[0][i]为i出发的最长路,f[1][i]为到i的最长路 新建源汇S,T,S向每个点连边,每个点向T连边 将所有点划分为两个集合S与T,一开始S中只有S,其它点都在T中 用一棵线段树维护所有连接属 ...
- [POI2014]Rally
OJ题号:BZOJ3832.洛谷3573 思路: 建立超级源汇$S$和$T$,DP求出分别以$S$和$T$为源点的最长路$diss$和$dist$. 对于每条边$i$,设定一个权值$w_i=diss_ ...
- BZOJ3832: [Poi2014]Rally(拓扑排序 堆)
题意 题目链接 Sol 最直观的思路是求出删除每个点后的最长路,我们考虑这玩意儿怎么求 设\(f[i]\)表示以\(i\)结尾的最长路长度,\(g[i]\)表示以\(i\)开始的最长路长度 根据DAG ...
- BZOJ:3832: [Poi2014]Rally
题意: 给出$DAG$,询问删掉哪个点之后最长路径最短 思路: 我们令$f[x]$表示从最远的点到达它的距离,$g[x]$表示它能够到达最远的点的距离 那么对于$(x -> y)$一条边来说,它 ...
随机推荐
- 表单数据转换成json格式数据
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- 2018.08.21 NOIP模拟 unlock(模拟+找规律)
unlock 描述 经济危机席卷全球,L国也收到冲击,大量人员失业. 然而,作为L国的风云人物,X找到了自己的新工作.从下周开始,X将成为一个酒店的助理锁匠,当然,他得先向部门领导展示他的开锁能力. ...
- 45 The Effect of External Rewards on Behavior 外界奖励对行为的影响
The Effect of External Rewards on Behavior 外界奖励对行为的影响 ①Psychologists take opposing views on how exte ...
- RabbitMQ添加rabbitmqadmin和其使用方法(类似Redis的redis-cli)
一:先进入rabbitmq的安装目录下的bin目录,执行wget -c http://localhost:15672/cli/rabbitmqadmin:(前提是plugin management已经 ...
- webuploader 文件上传总结
$(function() { /** * 初始化Web Uploader */ var uploader = WebUploader.create({ swf : '../mobile/Uploade ...
- day08(File类 ,字节流)
File类 构造方法 File(String path); FIle(String parent, String child); File(File parent, String child) ...
- Lucene.net 性能《第八篇》
一.IndexReader性能分析 IndexReader完成了打开所有索引文件和提供底层reader API等繁重的工作,而IndexSearch则要简单得多.由于打开一个IndexReader需要 ...
- HDU1518 Square(DFS) 2016-07-24 15:08 49人阅读 评论(0) 收藏
Square Problem Description Given a set of sticks of various lengths, is it possible to join them end ...
- 图形与游戏中3D数学基础的说明
1.左手坐标系与右手坐标系没有好坏之分,不同的研究领域和不同的背景下,选择不同的坐标系:传统计算机图形学采用“左手坐标系”,线性代数则倾向于使用右手坐标系 坐标系由坐标轴与坐标原点组成.原点定义坐标系 ...
- [mobile]移动端页面没有重新请求时,刷新页面代码
<input type="hidden" value="yes" id="id_if_reload" /> <script ...