OJ题号:
BZOJ3832、洛谷3573

思路:

建立超级源汇$S$和$T$,DP求出分别以$S$和$T$为源点的最长路$diss$和$dist$。
对于每条边$i$,设定一个权值$w_i=diss_{i.from}+dist_{i.to}-1$。
表示原图中包含这条边的从$S$到$T$的最长路。
然后按照拓扑序删点$x$,用堆维护不包含$x$的最长路长度。
然而一次性不能把所有边放进去,不然会MLE一个点(因为这个调了一个晚上)。
应该在换$x$的时候,把老$x$的出边重新加入,并将新$x$的入边删去。
注意开的数组不能太多,能合并的信息尽量合并,(比如所有边正反边用一个数组存,取值的时候用异或),不然把堆修改以后还是会MLE。

 #include<queue>
#include<cstdio>
#include<cctype>
#include<vector>
#include<ext/pb_ds/priority_queue.hpp>
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'';
while(isdigit(ch=getchar())) x=(((x<<)+x)<<)+(ch^'');
return x;
}
const int inf=0x7fffffff;
const int V=,E=;
struct Edge {
int from,to;
};
Edge e[E];
int w[E];
int s,t;
int n,m;
std::vector<int> eids[V],eidt[V];
int inds[V]={},indt[V]={};
inline void add_edge(const int u,const int v,int *ind,std::vector<int> *eid,const int i) {
eid[u].push_back(i);
ind[v]++;
}
int diss[V]={},dist[V]={};
std::queue<int> top;
inline void Kahn(const int s,std::vector<int> *eid,int *dis,int *ind,const int op=) {
std::queue<int> q;
q.push(s);
while(!q.empty()) {
int x=q.front();
q.pop();
if(op) top.push(x);
for(register unsigned i=;i<eid[x].size();i++) {
int y=e[eid[x][i]].from^e[eid[x][i]].to^x;
dis[y]=std::max(dis[y],dis[x]+);
if(!--ind[y]) q.push(y);
}
}
}
__gnu_pbds::priority_queue<int> q;
__gnu_pbds::priority_queue<int>::point_iterator p[E];
int v,ans=inf;
int cnt=;
inline void solve() {
while(!top.empty()) {
int x=top.front();
top.pop();
for(register unsigned i=;i<eidt[x].size();i++) {
q.erase(p[eidt[x][i]]);
}
if(!q.empty()) {
if((x!=s)&&(x!=t)&&(q.top()<ans)) {
ans=q.top();
v=x;
}
}
for(register unsigned i=;i<eids[x].size();i++) {
p[eids[x][i]]=q.push(w[eids[x][i]]);
}
}
}
int main() {
n=getint(),m=getint();
s=,t=n+;
for(register int i=;i<=n;i++) {
e[cnt].from=s,e[cnt].to=i;
add_edge(s,i,inds,eids,cnt);
add_edge(i,s,indt,eidt,cnt);
cnt++;
}
for(register int i=;i<m;i++) {
int &u=e[cnt].from=getint(),&v=e[cnt].to=getint();
add_edge(u,v,inds,eids,cnt);
add_edge(v,u,indt,eidt,cnt);
cnt++;
}
for(register int i=;i<=n;i++) {
e[cnt].from=i,e[cnt].to=t;
add_edge(i,t,inds,eids,cnt);
add_edge(t,i,indt,eidt,cnt);
cnt++;
}
Kahn(s,eids,diss,inds,);
Kahn(t,eidt,dist,indt);
for(register int i=;i<cnt;i++) {
w[i]=diss[e[i].from]+dist[e[i].to]-;
}
solve();
printf("%d %d\n",v,ans);
return ;
}

[POI2014]Rally的更多相关文章

  1. 【BZOJ3832】[POI2014]Rally(拓扑排序,动态规划)

    [BZOJ3832][POI2014]Rally(拓扑排序,动态规划) 题面 BZOJ,权限题 洛谷 题解 这题好强啊,感觉学了好多东西似的. 首先发现了一个图画的很好的博客,戳这里 然后我来补充一下 ...

  2. 3832: [Poi2014]Rally

    3832: [Poi2014]Rally 链接 分析: 首先可以考虑删除掉一个点后,计算最长路. 设$f[i]$表示从起点到i的最长路,$g[i]$表示从i出发到终点的最长路.那么经过一条边的最长路就 ...

  3. BZOJ3832[Poi2014]Rally——权值线段树+拓扑排序

    题目描述 An annual bicycle rally will soon begin in Byteburg. The bikers of Byteburg are natural long di ...

  4. 【BZOJ】3832: [Poi2014]Rally

    题意 \(n(2 \le n \le 500000)\)个点\(m(1 \le m \le 1000000)\)条边的有向无环图,找到一个点,使得删掉这个点后剩余图中的最长路径最短. 分析 神题不会做 ...

  5. BZOJ 3832: [Poi2014]Rally

    Sol 线段树+拓扑序. 先把图的拓扑序搞出来,然后统计从起点到该点最长链,从该点到终点的最长链,然后建个起点终点,这里跟网络流很像,把它统一到一个有起点的图中,这里也要注意下细节处理.S,T的一个边 ...

  6. BZOJ3832 : [Poi2014]Rally

    f[0][i]为i出发的最长路,f[1][i]为到i的最长路 新建源汇S,T,S向每个点连边,每个点向T连边 将所有点划分为两个集合S与T,一开始S中只有S,其它点都在T中 用一棵线段树维护所有连接属 ...

  7. BZOJ3832: [Poi2014]Rally(拓扑排序 堆)

    题意 题目链接 Sol 最直观的思路是求出删除每个点后的最长路,我们考虑这玩意儿怎么求 设\(f[i]\)表示以\(i\)结尾的最长路长度,\(g[i]\)表示以\(i\)开始的最长路长度 根据DAG ...

  8. BZOJ:3832: [Poi2014]Rally

    题意: 给出$DAG$,询问删掉哪个点之后最长路径最短 思路: 我们令$f[x]$表示从最远的点到达它的距离,$g[x]$表示它能够到达最远的点的距离 那么对于$(x -> y)$一条边来说,它 ...

  9. BZOJ3832 [Poi2014]Rally 【拓扑序 + 堆】

    题目链接 BZOJ3832 题解 神思路orz,根本不会做 设\(f[i]\)为到\(i\)的最长路,\(g[i]\)为\(i\)出发的最长路,二者可以拓扑序后\(dp\)求得 那么一条边\((u,v ...

随机推荐

  1. python---django中orm的使用(5)数据库的基本操作(性能相关:select_related,和prefetch_related重点)(以及事务操作)

    ################################################################## # PUBLIC METHODS THAT ALTER ATTRI ...

  2. windows10 升级1803后,远程错误提示“出现身份验证错误,要求的函数不受支持 CredSSP 加密 Oracle修正”的解决办法

    远程出现错误提示:出现身份验证错误,要求的函数不受支持 CredSSP 加密 Oracle修正 运行 gpedit.msc 本地组策略: 计算机配置>管理模板>系统>凭据分配> ...

  3. BFS简单题套路_Codevs 1215 迷宫

    BFS 简单题套路 1. 遇到迷宫之类的简单题,有什么行走方向的,先写下面的 声明 ; struct Status { int r, c; Status(, ) : r(r), c(c) {} // ...

  4. python学习笔记6--双色球需求实现

    # 5,随机产生5条双色球号码 # blue 存蓝色的求 01,02 # red 存红色的求 17,16,03 # date存生成的时间,精确达到秒 #处理 import random,datetim ...

  5. JavaScript 获取 flash 对象

    关于js获取flash对象,网上有非常多的例子,我也尝试了不少方法. 虽然都能用,但是没有我最想要的东西, 后来看了下百度的,虽然很规范,各种情况都考虑到了,但是代码量却不是不容乐观, 前前后后将近2 ...

  6. 微信公众号用户OpenID同步导出系统

    一.简介 同步公众账号用户信息,包括OpenID.昵称.头像.地区等. 二.主要功能 同步公众账号用户 OpenID,以及昵称.头像.性别.地区.关注时间等,支持认证订阅号.认证服务号. 支持超过1万 ...

  7. AngularJS入门基础——作用域

    作用域$scope是构成AngularJS应用的核心基础,在整个框架中都被广泛使用,因此了解它是非常重要的. $scope对像是定义应用业务逻辑,控制器方法和视图属性的地方.作用域是视图和控制器之间的 ...

  8. TED_Topic9:How we're priming some kids for college — and others for prison

    Alice Goffman In the United States, two institutions guide teenagers on the journey to adulthood: co ...

  9. Django Rest Framework-APIView源码分析

    class APIView(View): # The following policies may be set at either globally, or per-view. renderer_c ...

  10. Java中final关键字概述

    使用final修饰过的变量都不可以改变: 1.final修饰变量 恒定不变的属性,可以用final关键字来修饰: 变量名建议全部使用大写 final修饰的变量不能改变,如果程序中重新赋值,编译报错 例 ...