对于一个点 \(x\) 如何求答案?

由于这个图是个有向无环图,可以先拓扑排序一遍,求出每个点的拓扑序,从起点到它的最长路 \(d2\),从它到终点的最长路 \(d1\)。(我写代码是这么写的,注意顺序)

把拓扑序比小 \(x\) 的点的点集叫 \(A\),大的叫 \(B\)。答案就是 \(\max\limits_{u\in A,v\in B}(d2_u+d1_v+w_{(u,v)})\)。

发现当 \(x\) 的拓扑序变大 \(1\) 时,集合 \(A\) 会多一个数,集合 \(B\) 会少一个数。

可以动态维护最大值。

时间复杂度 \(O(m\log m)\)。

#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> PII;
const int maxn=1000100;
#define MP make_pair
#define FOR(i,a,b) for(int i=(a);i<=(b);i++)
#define ROF(i,a,b) for(int i=(a);i>=(b);i--)
#define MEM(x,v) memset(x,v,sizeof(x))
inline int read(){
int x=0,f=0;char ch=getchar();
while(ch<'0' || ch>'9') f|=ch=='-',ch=getchar();
while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();
return f?-x:x;
}
int n,m,el,ans1,ans2=2e9,head[maxn],to[maxn],nxt[maxn],el2,head2[maxn],to2[maxn],nxt2[maxn],deg[maxn],id[maxn],cnt,seq[maxn],q[maxn],h,r,d1[maxn],d2[maxn];
multiset<int,greater<int> > fuck;
inline void add(int u,int v){
to[++el]=v;nxt[el]=head[u];head[u]=el;
}
inline void add2(int u,int v){
to2[++el2]=v;nxt2[el2]=head2[u];head2[u]=el2;
}
int dfs(int u){
if(~d1[u]) return d1[u];
for(int i=head[u];i;i=nxt[i]) d1[u]=max(d1[u],dfs(to[i]));
return ++d1[u];
}
int main(){
n=read();m=read();
FOR(i,1,m){
int u=read(),v=read();
add(u,v);add2(v,u);
deg[v]++;
}
MEM(d1,-1);
FOR(i,1,n) if(d1[i]==-1) d1[i]=dfs(i);
h=1;r=0;
FOR(i,1,n) if(!deg[i]) q[++r]=i,seq[id[i]=++cnt]=i;
while(h<=r){
int u=q[h++];
for(int i=head[u];i;i=nxt[i]){
int v=to[i];
d2[v]=max(d2[v],d2[u]+1);
if(!--deg[v]) q[++r]=v,seq[id[v]=++cnt]=v;
}
}
FOR(i,1,n) fuck.insert(d1[i]);
FOR(i,1,n){
int u;
if(i!=1){
u=seq[i-1];
for(int e=head[u];e;e=nxt[e]){
int v=to[e];
fuck.insert(d2[u]+1+d1[v]);
}
fuck.insert(d2[u]);
}
u=seq[i];
for(int e=head2[u];e;e=nxt2[e]){
int v=to2[e];
multiset<int,greater<int> >::iterator it=fuck.find(d2[v]+1+d1[u]);
fuck.erase(it);
}
multiset<int,greater<int> >::iterator it=fuck.find(d1[u]);
fuck.erase(it);
if(*fuck.begin()<ans2) ans1=seq[i],ans2=*fuck.begin();
}
printf("%d %d\n",ans1,ans2);
}

[POI2014]RAJ(最短路,拓扑排序)的更多相关文章

  1. [NOIP2017]逛公园 最短路+拓扑排序+dp

    题目描述 给出一张 $n$ 个点 $m$ 条边的有向图,边权为非负整数.求满足路径长度小于等于 $1$ 到 $n$ 最短路 $+k$ 的 $1$ 到 $n$ 的路径条数模 $p$ ,如果有无数条则输出 ...

  2. [Luogu P3953] 逛公园 (最短路+拓扑排序+DP)

    题面 传送门:https://www.luogu.org/problemnew/show/P3953 Solution 这是一道神题 首先,我们不妨想一下K=0,即求最短路方案数的部分分. 我们很容易 ...

  3. 【BZOJ5109】[CodePlus 2017]大吉大利,晚上吃鸡! 最短路+拓扑排序+DP

    [BZOJ5109][CodePlus 2017]大吉大利,晚上吃鸡! Description 最近<绝地求生:大逃杀>风靡全球,皮皮和毛毛也迷上了这款游戏,他们经常组队玩这款游戏.在游戏 ...

  4. BZOJ1880:[SDOI2009]Elaxia的路线(最短路,拓扑排序)

    Description 最近,Elaxia和w**的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间.Elaxia和w**每天都要奔波于宿舍和实验室之间, ...

  5. NOIP2017 Day1 T3 逛公园(最短路+拓扑排序+DP)

    神tm比赛时多清个零就有60了T T 首先跑出1起点和n起点的最短路,因为k只有50,所以可以DP.设f[i][j]表示比最短路多走i的长度,到j的方案数. 我们发现如果在最短路上的和零边会有后向性, ...

  6. 【BZOJ1880】[SDOI2009]Elaxia的路线 (最短路+拓扑排序)

    [SDOI2009]Elaxia的路线 题目描述 最近,\(Elaxia\)和\(w**\)的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间. \(El ...

  7. Luogu3953 NOIP2017逛公园(最短路+拓扑排序+动态规划)

    跑一遍dij根据最短路DAG进行拓扑排序,按拓扑序dp即可.wa了三发感觉非常凉. #include<iostream> #include<cstdio> #include&l ...

  8. P3008 [USACO11JAN]Roads and Planes G (最短路+拓扑排序)

    该最短路可不同于平时简单的最短路模板. 这道题一看就知道用SPFA,但是众所周知,USACO要卡spfa,所以要用更快的算法. 单向边不构成环,双向边都是非负的,所以可以将图分成若干个连通块(内部只有 ...

  9. BZOJ 2200--[Usaco2011 Jan]道路和航线(最短路&拓扑排序)

    2200: [Usaco2011 Jan]道路和航线 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 1128  Solved: 414[Submit] ...

  10. HDU 3342 Legal or Not (最短路 拓扑排序?)

    Legal or Not Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

随机推荐

  1. 【mysql报错】MySQL host is blocked because of many connection errors; 解决方法

    MySQL host is blocked because of many connection errors; 报错 环境 操作系统:Linux 数据库:mysql5.7.27 错误提示 jHost ...

  2. python中pkl用法

    原文连接:https://www.jianshu.com/p/2ecadebe6d13 python中pkl用法 经常遇到在Python程序运行得到了一些字符串.列表.字典等数据,想要长久的保存下来, ...

  3. LeetCode Contest 166

    LeetCode Contest 166 第一次知道LeetCode 也有比赛. 很久没有打过这种线上的比赛,很激动. 直接写题解吧 第一题 很弱智 class Solution { public: ...

  4. 第五篇 openvslam建图与优化模块梳理

    建图模块 mapping_module在初始化系统的时候进行实例化,在构建实例的时候会实例化local_map_cleaner和local_bundle_adjuster.系统启动的时候会在另外一个线 ...

  5. MySQL5.6升级到5.7详细教程

    前言:最近看了下系统的数据库是5.6的,想着升级到5.7,特此记录 一.官网下载MySQL5.7rpm包(4个) 进入MySQL community download页面,默认是MySQL最新版8.0 ...

  6. C#,WPF,DataGrid,Excel,导出

    private void btnExport_Click(object sender, RoutedEventArgs e) { System.Diagnostics.Stopwatch sw = n ...

  7. Pytest 测试框架

    一 . Pytest 简介 Pytest是python的一种单元测试框架. 1. pytest 特点 入门简单,文档丰富 支持单元测试,功能测试 支持参数化,重复执行,部分执行,测试跳过 兼容其他测试 ...

  8. mvc 返回json格式时间格式化

    protected override JsonResult Json(object data, string contentType, System.Text.Encoding contentEnco ...

  9. Web点击链接调起手机系统自带短信发短信

    实现代码如下: 一.Html代码 <a href="javascript:;" class="xq-sms">发送短信</a> 二.jQ ...

  10. 家电制造业中MES系统发挥的作用

    人们对MES系统在家电生产领域的应用并不陌生,这是离散型MES应用的一个重要领域. 如空调.冰箱.电视.洗衣机等生产加工中均具有批量制造.多品种小批量.单件生产的等特点,很多企业也是以以订单.合同为核 ...