题目链接

BZOJ3832

题解

神思路orz,根本不会做

设\(f[i]\)为到\(i\)的最长路,\(g[i]\)为\(i\)出发的最长路,二者可以拓扑序后\(dp\)求得
那么一条边\((u,v)\)的对应的最长链就是\(f[u] + 1 + g[v]\)
我们人为加入源汇点\(S\),\(T\),\(S\)向每个点连边,每个点向\(T\)连边
我们考虑把整个图划分开
一开始所有点都在\(T\)这边,割边为所有\(S\)的边
然后我们按照拓扑序把点逐一加入\(S\)集合中
加入时,我们删去\(S\)集合连向该点的边,然后询问所有边的最大值,即为删去该点的最长链
加入后,我们加入该点连向\(T\)集合的边
由于是按照拓扑序,所以以上提到的所有边就是该点的所有入边/出边

然后所有边的最大值可以用堆或者线段树维护

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#include<cmath>
#include<map>
#define Redge(u) for (int k = h[u]; k; k = ed[k].nxt)
#define REP(i,n) for (int i = 1; i <= (n); i++)
#define mp(a,b) make_pair<int,int>(a,b)
#define cls(s) memset(s,0,sizeof(s))
#define cp pair<int,int>
#define LL long long int
using namespace std;
const int maxn = 500005,maxm = 2000005,INF = 1000000000;
inline int read(){int out = 0,flag = 1; char c = getchar();while (c < 48 || c > 57){if (c == '-') flag = -1; c = getchar();}while (c >= 48 && c <= 57){out = (out << 3) + (out << 1) + c - 48; c = getchar();}return out * flag;
}
struct Heap{priority_queue<int> a,b;void ck(){while (!b.empty() && a.top() == b.top()) a.pop(),b.pop();}int size(){return a.size() - b.size();}void ins(int x){ck(); a.push(x);}void del(int x){ck(); b.push(x);}int top(){ck(); return size() ? a.top() : 0;}
}H;
int n,m,f[maxn],g[maxn],s[maxn];
int q[maxn],head,tail;
int h[maxn],de[maxn],ne;
int hi[maxn],nei;
struct EDGE{int to,nxt;}ed[maxm],e[maxm];
inline void build(int u,int v){ed[++ne] = (EDGE){v,h[u]}; h[u] = ne;de[v]++;e[++nei] = (EDGE){u,hi[v]}; hi[v] = nei;
}
void topu(){head = 0; tail = -1; int u;REP(i,n) if (!de[i]) q[++tail] = i;REP(i,n){s[i] = u = q[head++];Redge(u) if (!(--de[ed[k].to])) q[++tail] = ed[k].to;}
}
void init(){REP(i,n){int u = s[i];Redge(u) f[ed[k].to] = max(f[ed[k].to],f[u] + 1);}for (int i = n; i; i--){int u = s[i];Redge(u) g[u] = max(g[u],g[ed[k].to] + 1);}
}
void solve(){int ans = INF,ansu = 0,x;REP(i,n) H.ins(g[i]);REP(i,n){int u = s[i];H.del(g[u]);for (int k = hi[u]; k; k = e[k].nxt)H.del(f[e[k].to] + 1 + g[u]);x = H.top();if (x < ans) ans = x,ansu = u;H.ins(f[u]);Redge(u) H.ins(f[u] + 1 + g[ed[k].to]);}printf("%d %d\n",ansu,ans);
}
int main(){n = read(); m = read();int a,b;REP(i,m){a = read(); b = read();build(a,b);}topu();init();//REP(i,n) printf("node%d  f = %d   g = %d\n",i,f[i],g[i]);solve();return 0;
}

转载于:https://www.cnblogs.com/Mychael/p/9097788.html

BZOJ3832 [Poi2014]Rally 【拓扑序 + 堆】相关推荐

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

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

  2. [BZOJ3832][Poi2014]Rally

    [BZOJ3832][Poi2014]Rally 试题描述 An annual bicycle rally will soon begin in Byteburg. The bikers of Byt ...

  3. 解题报告:NOIP2013 车站分级(拓扑序递推求解差分约束、建图优化O(n+m)) 超详细讲解

    本题是2013年NOIP普及组的压轴题 差分约束裸题. 计算当前线路中最小的级别(比较始发站和终点站). 整条线路中所有大于这个级别的都必须停靠 所有未停靠的站点的级别一定小于这个级别 也就是说所有未 ...

  4. hdu3342 拓扑序

    题意:一个QQ群里面有一群大神,他们互相帮助解决问题,然后互相膜拜,于是有些人就称别人是他师父,现在给出很多师徒关系,问是否有矛盾 拓扑序,按师徒关系建边直接拓扑序就行了. 1 #include< ...

  5. Weights Assignment For Tree Edges 树,拓扑序(1500)

    题意 : 给定n个结点的树和序列bbb和ppp,bib_ibi​表示i结点的父节点,其中broot=rootb_{root}=rootbroot​=root,现在要给树上的每个边赋正权值,使得每个结点 ...

  6. 字典序最小是什么意思_《拓扑序简介》第十六讲

    这是民科+大忽悠+地摊报告,我准备把拓扑序吹成天上有地上无.人见人爱.老幼咸宜.不买会后悔的什么东西.珍惜青春,珍惜钱包,请大家谨慎对待大忽悠.下面是回放视频的链接. 蔻享--共享科学.传播科学​ww ...

  7. CF1385E Directing Edges 拓扑序

    传送门 文章目录 题意: 思路: 题意: 给你一个图和若干个边,有些是有向边,有些是无向边,让你给无向边定向,使得最终的图是DAGDAGDAG. 思路: 题目让构造DAGDAGDAG,比较容易想到拓扑 ...

  8. HDU - 1811 Rank of Tetris 并查集 + 拓扑序 +me

    link 题意: 首先看到排名自然想到拓扑序,但是存在等于的情况,这就启发我们把等于的情况缩成一个点,让后在缩点后的图中进行拓扑即可. 对于不合法的情况当然是拓扑序没有遍历到应该遍历的点,所以只需要检 ...

  9. 【图论训练】最小拓扑序

    最小拓扑序 topsort.pas/c/cpp [题目描述] 给一个有向无环图,求其字典序最小的拓扑序. 一个拓扑序被认为字典序{pi}最小当且仅当对于任何其他拓扑序{qi},均存在正整数k,使得对于 ...

最新文章

  1. MATLAB中的fft后为何要用fftshift?
  2. 【GitLab】Gitlab用户在组中有五种权限:Guest、Reporter、Developer、Master、Owner
  3. vscode 将本地项目上传到github、从github克隆项目以及删除github上的某个文件夹
  4. STM32 FSMC学习笔记
  5. 利用PHP SOAP实现web service
  6. .sql文件如何执行_mysql:一条SQL查询语句是如何执行的?
  7. 堆叠自编码器中的微调解释_25种深刻漫画中的编码解释
  8. Java IO流总结
  9. 魔方层先法简明图解,最少记6个公式即可完成魔方六面
  10. 记一次奇怪的debug:Tomcat部署网站每一个页面第一次打开404刷新后才正常显示...
  11. QQ空间自动发广告说说?可能是激活工具附带的独狼Rootkit!
  12. MIL图像库的使用——配合图像采集卡
  13. Microsoft visual studio关闭安全检查的几种方法(2015/2017)
  14. Work Stealing
  15. 敏捷项目中的进度控制
  16. Mob 秒验 实测评
  17. 知识图谱·概念与技术--第1章学习笔记--知识图谱概述--知识图谱的概念,与传统语义网络的区别
  18. 《苏菲的世界》——读书笔记
  19. html5无法绘制线条,Html5画布 - 使用fabric.js绘制完美线条或不使用
  20. 爱德华索普与西蒙斯:量化投资的那些传奇们

热门文章

  1. Qt Creator中常用快捷键和小技巧
  2. 湖北省政府网站刊文:感染新冠肺炎的适龄男性应进行生育力检查
  3. 微软10亿美元投资AI公司助力云计算,研发通用人工智能
  4. #pragma message的作用
  5. android 模拟器识别,一种基于符号的识别Android应用运行在模拟器中的方法与流程...
  6. 012_日期内建函数
  7. 005_Queue消息模式发送字节消息
  8. 如何用html绘制阴影图形,HTML5 给图形绘制阴影
  9. php mysql切换版本5.7_phpstudy 升级 MySQL版本到MySQL5.7
  10. linux中mtools工具_Linux mtools命令