传送门(权限)

题目大意

给定一个有向无环图,可以删去一个点和所有与它相连的边,使得图的其余部分最长路径最小,求这个位置和最小的最长路径长度。

题解

对于每一条边$u\rightarrow v$,设$F_u$表示从任意位置出发到达$u$的最多边数,设$G_v$表示从$v$出发到达任意位置的最多边数,那么最长链即为$\max\{F_u+G_v+1\}$。

考虑删掉点$x$。

对于字拓扑序在$x$之前的$y$,那么一定有一条链长度为$F_y$,拓扑序在$x$之后的$y$一定有一条长度为$G_y$的链。对于拓扑序和$x$属于并列关系的$y$,和它相邻的所有边一定$(u\rightarrow v)$,其中$u=y$或$v=y$,显然存在$F_u+G_v+1$的链。

那么按照拓扑序处理每一个点,维护一个集合$S$表示当前有效的链。

初始时$S$只用所有$G_x$,按照顺序拓扑序序枚举点$x$,然后删去它新失效的边是所有$(u\rightarrow x)$的边的$F_u+G_x+1$以及$G_x$,这时集合内的元素的最大值就是最长链的长度。然后删去它之后生效的边是所有$(x\rightarrow v)$的$F_x+G_v+1$,因为要确保接下来的拓扑序相互并列的两个点能够相互更新,不难发现删去所有它的后继节点后这些$x\rightarrow v$的$F_x+G_v+1$会自行删除。

在所有的答案中取最小值顺便记录位置即可。

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#define LL long long
#define M 500020
using namespace std;
const int BS=(1<<20)+5; char Buffer[BS],*HD,*TL;
char Getchar(){if(HD==TL){TL=(HD=Buffer)+fread(Buffer,1,BS,stdin);} return (HD==TL)?EOF:*HD++;}
int read(){
int nm=0,fh=1; char cw=Getchar();
for(;!isdigit(cw);cw=Getchar()) if(cw=='-') fh=-fh;
for(;isdigit(cw);cw=Getchar()) nm=nm*10+(cw-'0');
return nm*fh;
}
int n,m,fs[M][2],nt[M<<1][2],to[M<<1][2],otd[M][2];
int q[M],hd,tl,,ans,pos,tmp,dis[M][2];
priority_queue<int> Q,D;
inline void rw(){while((!D.empty())&&D.top()==Q.top()) Q.pop(),D.pop();}
#define del(a) D.push(a),rw()
#define ins(a) Q.push(a)
#define tp Q.top()
void link(int x,int y){
nt[tmp][0]=fs[x][0],nt[tmp][1]=fs[y][1],otd[x][0]++,otd[y][1]++;
to[tmp][0]=y,to[tmp][1]=x,fs[x][0]=fs[y][1]=tmp,tmp++;
}
int DP(int x,int kd){
if(!otd[x][kd]) return 0; if(dis[x][kd]) return dis[x][kd];
for(int i=fs[x][kd];i!=-1;i=nt[i][kd]) dis[x][kd]=max(dis[x][kd],DP(to[i][kd],kd));
++dis[x][kd]; return dis[x][kd];
}
int main(){
n=read(),m=read(),memset(fs,-1,sizeof(fs)),ans=n-1,pos=1;
for(int i=1;i<=m;i++){int x=read(),y=read();link(x,y);}
for(int i=1;i<=n;i++) DP(i,0),DP(i,1),ins(dis[i][0]);
for(int i=1;i<=n;i++) if(!otd[i][1]) q[tl++]=i;
while(hd<tl){
int x=q[hd++],maxn; del(dis[x][0]);
for(int i=fs[x][1];i!=-1;i=nt[i][1]) del(dis[to[i][1]][1]+dis[x][0]+1);
maxn=tp; if(maxn<ans) ans=maxn,pos=x; ins(dis[x][1]);
for(int i=fs[x][0];i!=-1;i=nt[i][0]){
ins(dis[to[i][0]][0]+dis[x][1]+1);
if(!(--otd[to[i][0]][1])) q[tl++]=to[i][0];
}
}printf("%d %d\n",pos,ans); return 0;
}

  

BZOJ3832 Rally的更多相关文章

  1. POI2014

    ...一个shabi和一堆神题的故事 今天只写了两道 之后随缘更吧 啊 顺便 snake我是不会更的 bzoj3829 POI2014 Farmcraft mhy住在一棵有n个点的树的1号结点上,每个 ...

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

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

  3. 【BZOJ-3832】Rally 拓扑序 + 线段树 (神思路题!)

    3832: [Poi2014]Rally Time Limit: 20 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 168  Solved:  ...

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

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

  5. 【bzoj3832】Rally

    Portal -->bzoj3832 Description ​ 给你一个DAG,每条边长度都是\(1\),请找一个点满足删掉这个点之后剩余图中的最长路最短 Solution ​​ 这题的话感觉 ...

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

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

  7. BZOJ3832 : [Poi2014]Rally

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

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

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

  9. 并不对劲的bzoj3832: [Poi2014]Rally

    传送门-> 这题的原理看上去很神奇. 称拓扑图中入度为0的点为“起点”,出度为0的点为“终点”. 因为“起点”和“终点”可能有很多个,算起来会很麻烦,所以新建“超级起点”S,向所有点连边,“超级 ...

随机推荐

  1. PL/SQL连接ORACLE失败,ORA-12154: TNS: could not resolve the connect identifier specified

    项目需要使用ORACLE,安装了oracle之后,使用PL/SQL连接,先是提示NOT logger  ,后续不知道改了什么提示解析服务器id失败,重新装了之后更狠的直接来了个空白提示 一.安装PLS ...

  2. idea java web 使用说明

    String realPath = request.getSession().getServletContext().getRealPath(uploadPath);//上传压缩包所在目录       ...

  3. 前端之 Ajax(补)

    概述 对于WEB应用程序:用户浏览器发送请求,服务器接收并处理请求,然后返回结果,往往返回就是字符串(HTML),浏览器将字符串(HTML)渲染并显示浏览器上. 1.传统的Web应用 一个简单操作需要 ...

  4. SOA 面向服务架构 阅读笔记(四)

    15  SOA管理 15.1 管理指的是实现一个制约和平衡的一致过程,以确保得到期望的结果. 15.2 管理被广泛应用于人工流程和软件流程中,一旦管理失败,后果会非常严重. 15.3 SOA管理的首要 ...

  5. IDEA使用前的各种基本设置(转)

    先搞个链接,以后自己慢慢总结:传送门

  6. 后向传播算法“backpropragation”详解

    为什么要使用backpropagation? 梯度下降不用多说,如果不清楚的可以参考梯度下降算法. 神经网络的参数集合theta,包括超级多组weight和bais. 要使用梯度下降,就需要计算每一个 ...

  7. 第一章 安装MongoDB

    需要下载 高效开源数据库(mongodb) V3.0.6 官方正式版 安装配置: MongoDB默认的数据目录为:C:\data\db.如果不用默认目录,则需要在在mongod.exe命令后加--db ...

  8. juniper防火墙清空配置恢复出厂设置命令

    1. console进入防火墙之后,输入unset all ,然后选择 yes2. 然后输入 reset ,回车,选择 no ,再选择 yes .然后等待防火墙重启. 恢复出厂默认配置: 1.在Con ...

  9. HDU 2430 Beans (单调队列+公式化简)

    题意:给你n袋豆子,每袋都有w[i]个豆子,接着任选连续任意个袋子的豆子合在一起放入容量为p的多个袋子里(每个袋子必须放满),问剩余的豆子数<=k时,能放满最多的袋子的个数 题解:个数与p都比较 ...

  10. vijos 1250 最勇敢的机器人 分组背包+并查集

    P1250最勇敢的机器人 背景 Wind设计了很多机器人.但是它们都认为自己是最强的,于是,一场比赛开始了~ 描述 机器人们都想知道谁是最勇敢的,于是它们比赛搬运一些物品. 它们到了一个仓库,里面有n ...