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. Request.Cookies 和 Response.Cookies 的区别

    .NET中提供了读写Cookie的多种方法,Request.Cookies 是客户端通过 Cookie 标头形式由客户端传输到服务器的 Cookie:Response.Cookies 在服务器上创建并 ...

  2. 浅说Get请求和Post请求

    Web 上最常用的两种 Http 请求就是 Get 请求和 Post 请求了.我们在做 java web 开发时,也总会在 servlet 中通过 doGet 和 doPost 方法来处理请求:更经常 ...

  3. Spring: 读取 .properties 文件地址,json转java对象,el使用java类方法相关 (十三)

    1. 在Java中获取 .properties 文件的路径 (src/main/resources 下) ProjectName |---src/main/java |---src/main/reso ...

  4. Jad查看源码

    需要者两个文件:下载地址:http://pan.baidu.com/s/11qq4I 1,解压jar包 有两个文件 分别是net.sf.jadclipse_3.3.0 jad.exe 文件 2,找到m ...

  5. [转]OpenMP 入门指南

    简介 这门课作为 ECE 中少有的跟计算机科学相关的课,自然是必上不可.不过无论是 OpenMP 还是 CUDA,对于平时极少接触并行编程的我来说,都是十分吃力的,第一次作业的 OpenMP 编程已经 ...

  6. State Estimation for Robotics (Tim Barfoot) exercises Answers

    Here are some exercises answers for State Estimation for Robotics, which I did in June, 2017. The bo ...

  7. 如何使用jpegtran 压缩JPG图片

    说到jpegtran相信很多人都比较陌生,网上相关的资料也很少. jpegtran可以让图片更加的简化,缩小图片的容量,从而增加网络的传输速度.说在多你也不信,下面就让事实证明. 首先下载  jpeg ...

  8. Linux TTY驱动--Uart_driver底层【转】

    转自:http://blog.csdn.net/sharecode/article/details/9196591 版权声明:本文为博主原创文章,未经博主允许不得转载. Linux 中将串口驱动进行了 ...

  9. Python3安装配置【转】

    不建议卸载python2 可能会导致系统内其他软件无法使用,如果使用最新的Python3那么我们知道编译安装源码包和系统默认包之间是没有任何影响的,所以可以安装python3和python2共存 (前 ...

  10. 走进异步编程的世界--async/await项目使用实战

    起因:今天要做一个定时器任务:五分钟查询一次数据库发现超时未支付的订单数据将其状态改为已经关闭(数据量大约100条的情况) 开始未使用异步: public void SelfCloseGpPayOrd ...