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)$一条边来说,它 ...
随机推荐
- php下的原生ajax请求
浏览器中为我们提供了一个JS对象XMLHttpRequet,它可以帮助我们发送HTTP请求,并接受服务端的响应. 意味着我们的浏览器不提交,通过JS就可以请求服务器. ajax(Asynchron ...
- OAuth2.0 Owin 授权问题
http://www.cnblogs.com/dudu/p/4569857.html OAuth2.0 一.什么是OAuth OAuth是一个关于授权(Authorization)的开放网络标准,目前 ...
- laravel加载视图
1.控制器 2.路由 3.视图
- [SoapUI] 重载JSONComparator比对JSON Response,忽略小数点后几位,将科学计数法转换为普通数字进行比对,在错误信息中打印当前循环的case number及其他附加信息
重载JSONComparator比对JSON Response,忽略小数点后几位,将科学计数法转换为普通数字进行比对,在错误信息中打印当前循环的case number及其他附加信息 package d ...
- 用户体验要好,App动画得这么做
以下内容由Mockplus团队翻译整理,仅供学习交流,Mockplus是更快更简单的原型设计工具. 在用户体验设计方面,App动画的设计和添加,带给设计师无限的创造空间的同时,也成为设计师群体最具 ...
- Memocache
http://blog.csdn.net/zhoufoxcn/article/details/6282099 http://blog.csdn.net/dinglang_2009/article/de ...
- asp.net web 通过IHttpAsyncHandler接口进行消息推送
.消息类,可直接通过这个类推送消息 HttpMessages using System; using System.Collections.Generic; using System.Linq; us ...
- delphi 数据库技术沉浮录--谨给成为历史的BDE
2014年9月,delphi xe7 出来了,这次在数据库技术方面,彻底抛掉了从1995 年 delphi 1.0 就自带的(Borland Database Engine)数据库访问技术.从而宣告了 ...
- 2018.09.02 Atcoder Regular Contest 102简要题解
比赛传送门 T1 Triangular Relationship 分析之后发现有两种情况: 1. n为奇数,那么所有数都是k的倍数. 2. n为偶数,那么所有数都是k/2的倍数. 然后就可以愉快A题了 ...
- hdu-1711(kmp算法)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1711 思路:kmp模板,注意用scanf,不然超时. #include<iostream> ...