[POI2014]RAJ(最短路,拓扑排序)
对于一个点 \(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(最短路,拓扑排序)的更多相关文章
- [NOIP2017]逛公园 最短路+拓扑排序+dp
题目描述 给出一张 $n$ 个点 $m$ 条边的有向图,边权为非负整数.求满足路径长度小于等于 $1$ 到 $n$ 最短路 $+k$ 的 $1$ 到 $n$ 的路径条数模 $p$ ,如果有无数条则输出 ...
- [Luogu P3953] 逛公园 (最短路+拓扑排序+DP)
题面 传送门:https://www.luogu.org/problemnew/show/P3953 Solution 这是一道神题 首先,我们不妨想一下K=0,即求最短路方案数的部分分. 我们很容易 ...
- 【BZOJ5109】[CodePlus 2017]大吉大利,晚上吃鸡! 最短路+拓扑排序+DP
[BZOJ5109][CodePlus 2017]大吉大利,晚上吃鸡! Description 最近<绝地求生:大逃杀>风靡全球,皮皮和毛毛也迷上了这款游戏,他们经常组队玩这款游戏.在游戏 ...
- BZOJ1880:[SDOI2009]Elaxia的路线(最短路,拓扑排序)
Description 最近,Elaxia和w**的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间.Elaxia和w**每天都要奔波于宿舍和实验室之间, ...
- NOIP2017 Day1 T3 逛公园(最短路+拓扑排序+DP)
神tm比赛时多清个零就有60了T T 首先跑出1起点和n起点的最短路,因为k只有50,所以可以DP.设f[i][j]表示比最短路多走i的长度,到j的方案数. 我们发现如果在最短路上的和零边会有后向性, ...
- 【BZOJ1880】[SDOI2009]Elaxia的路线 (最短路+拓扑排序)
[SDOI2009]Elaxia的路线 题目描述 最近,\(Elaxia\)和\(w**\)的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间. \(El ...
- Luogu3953 NOIP2017逛公园(最短路+拓扑排序+动态规划)
跑一遍dij根据最短路DAG进行拓扑排序,按拓扑序dp即可.wa了三发感觉非常凉. #include<iostream> #include<cstdio> #include&l ...
- P3008 [USACO11JAN]Roads and Planes G (最短路+拓扑排序)
该最短路可不同于平时简单的最短路模板. 这道题一看就知道用SPFA,但是众所周知,USACO要卡spfa,所以要用更快的算法. 单向边不构成环,双向边都是非负的,所以可以将图分成若干个连通块(内部只有 ...
- BZOJ 2200--[Usaco2011 Jan]道路和航线(最短路&拓扑排序)
2200: [Usaco2011 Jan]道路和航线 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 1128 Solved: 414[Submit] ...
- HDU 3342 Legal or Not (最短路 拓扑排序?)
Legal or Not Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ...
随机推荐
- Linux高性能服务器编程,书中的 shell 命令
记录<Linux高性能服务器编程>书里面讲解到的若干 shell 命令 arp 命令查看ARP高速缓存: [root@VM_0_10_centos heliang]# arp -a ? ( ...
- webpack-实用的2个配置
①:运行npm run dev 后自动打开浏览器 首先找到config里面的index.js文件,然后打开找到autoOpenBrowser属性,把默认的false改为true即可 ②:简写路径 ...
- Autoware 培训笔记 No. 2——基于点云的定位
1. 前言 构建出地图后,应该测试点云地图定位效果,这里用到ndt的scan_matching方法,这是一种scan-to-map方法.这里用的是我们自己采集的数据进行仿真. 本章内容有和No. 1重 ...
- v-model绑定一个对象,组件内部分别负责不同字段的场景实现
我们知道v-model对于单个property双向数据绑定非常有用,保持父子组件之间的数据传递和同步,但也有很多场景下希望一个组件能够处理多个数据字段,这时就有一些小小技巧了. https://sim ...
- 一行 Python
很多人学Python,除了它功能强大,简单易学外,代码行数少.语法简洁也是很吸引人的地方.那么,Python的语法到底有多简洁呢?一行Python代码,能实现什么丧心病狂的功能呢? 1.一行代码,实现 ...
- Java多线程——查看线程堆栈信息
Java多线程——查看线程堆栈信息 摘要:本文主要介绍了查看线程堆栈信息的方法. 使用Thread类的getAllStackTraces()方法 方法定义 可以看到getAllStackTraces( ...
- ASP.NET Core系列:日志
1. NLog 添加安装包: Install-Package NLog.Web.AspNetCore <?xml version="1.0" encoding="u ...
- mpvue小程序开发之 实现一个弹幕评论
先上图 就是一个简单的弹幕发送功能 弹幕区的页面: <div class="content" v-show="doommData.length"> ...
- LeetCode——Nth Highest Salary
Write a SQL query to get the nth highest salary from the Employee table. +----+--------+ | Id | Sala ...
- 微信支付:chooseWXPay:fail, the permission value is offline verifying
在开发公众号微信支付的时候,到了支付那一步,页面上看到微信支付的loading一闪而过,但是没有出现微信支付的页面.控制台log显示错误信息:“chooseWXPay:fail, the permis ...