我们把“u点能够到达的最大点”转化为反向图中能到达u点的所有点里的最大值,可知缩点后满足无后效性。val[i]的初值设为连通分量i中的最大点。反向存图,tarjan缩点,拓扑序dp即可。

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <queue>
  4. #define maxn 100100
  5. using namespace std;
  6. int n, m;
  7. void read(int &x) {
  8. x = 0;
  9. char ch = getchar();
  10. while (!isdigit(ch))
  11. ch = getchar();
  12. while (isdigit(ch))
  13. x = x * 10 + (ch ^ 48),
  14. ch = getchar();
  15. return;
  16. }
  17. struct E {
  18. int to, nxt;
  19. } edge[maxn], edge2[maxn];
  20. int head[maxn], top, head2[maxn], top2;
  21. inline void insert(int u, int v) {
  22. edge[++top] = (E) {v, head[u]};
  23. head[u] = top;
  24. }
  25. inline void insert2(int u, int v) {
  26. edge2[++top2] = (E) {v, head2[u]};
  27. head2[u] = top2;
  28. }
  29. int low[maxn], dfn[maxn], timer, c[maxn], cnt, sta[maxn], stp;
  30. bool ins[maxn];
  31. int val[maxn];
  32. void tarjan(int u) {
  33. low[u] = dfn[u] = ++ timer;
  34. sta[++stp] = u, ins[u] = true;
  35. for (int i = head[u]; i; i = edge[i].nxt) {
  36. int v = edge[i].to;
  37. if (!dfn[v]) {
  38. tarjan(v);
  39. low[u] = min(low[u], low[v]);
  40. } else if (ins[v])
  41. low[u] = min(low[u], dfn[v]);
  42. }
  43. if (dfn[u] == low[u]) {
  44. ++cnt;
  45. int x;
  46. do {
  47. x = sta[stp--];
  48. ins[x] = false;
  49. c[x] = cnt;
  50. val[cnt] = max(val[cnt], x);
  51. } while (x != u);
  52. }
  53. }
  54. int ind[maxn];
  55. void build() {
  56. for (int u = 1; u <= n; ++u)
  57. for (int i = head[u]; i; i = edge[i].nxt) {
  58. int v = edge[i].to;
  59. if (c[u] != c[v])
  60. insert2(c[u], c[v]), ++ind[c[v]];
  61. }
  62. }
  63. void dp() {
  64. queue<int> que;
  65. for (int i = 1; i <= cnt; ++i)
  66. if (!ind[i]) que.push(i);
  67. while (!que.empty()) {
  68. int u = que.front(); que.pop();
  69. for (int i = head2[u]; i; i = edge2[i].nxt) {
  70. int v = edge2[i].to;
  71. val[v] = max(val[v], val[u]);
  72. --ind[v];
  73. if (!ind[v])
  74. que.push(v);
  75. }
  76. }
  77. return;
  78. }
  79. int main() {
  80. read(n), read(m);
  81. int u, v;
  82. for (int i = 1; i <= m; ++i) {
  83. read(u), read(v);
  84. insert(v, u);
  85. }
  86. for (int i = 1; i <= n; ++i)
  87. if (!dfn[i])
  88. tarjan(i);
  89. build();
  90. dp();
  91. for (int i = 1; i <= n; ++i)
  92. printf("%d ", val[c[i]]);
  93. return 0;
  94. }

至此luogu上真哥留下的缩点习题全部完成。晚上更新对最小树形图(朱刘算法)的理解。

Luogu P43916 图的遍历的更多相关文章

  1. luogu P3916 图的遍历

    P3916 图的遍历 题目描述 给出 N 个点, M 条边的有向图,对于每个点 v ,求 A(v) 表示从点 v 出发,能到达的编号最大的点. 输入输出格式 输入格式: 第1 行,2 个整数 N,MN ...

  2. Luogu P3916 图的遍历 【优雅的dfs】【内有待填坑】By cellur925

    说明 • 对于60% 的数据, n,m在1e3内 • 对于100% 的数据, n,m在1e5内. 本弱弱上来就是一顿暴搜打,dfs n次,每次更新答案,复杂度为O(n*n),果然TLE,60分抱回家. ...

  3. 图的遍历(搜索)算法(深度优先算法DFS和广度优先算法BFS)

    图的遍历的定义: 从图的某个顶点出发访问遍图中所有顶点,且每个顶点仅被访问一次.(连通图与非连通图) 深度优先遍历(DFS): 1.访问指定的起始顶点: 2.若当前访问的顶点的邻接顶点有未被访问的,则 ...

  4. C++编程练习(9)----“图的存储结构以及图的遍历“(邻接矩阵、深度优先遍历、广度优先遍历)

    图的存储结构 1)邻接矩阵 用两个数组来表示图,一个一维数组存储图中顶点信息,一个二维数组(邻接矩阵)存储图中边或弧的信息. 2)邻接表 3)十字链表 4)邻接多重表 5)边集数组 本文只用代码实现用 ...

  5. Kruskal和prime算法的类实现,图的遍历BFS算法。

    一.图的遍历 #include<iostream> #include<queue> #include<vector> using namespace std; in ...

  6. 图的遍历——DFS(矩形空间)

    首先,这里的图不是指的我们一般所说的图结构,而是大小为M*N的矩形区域(也可以看成是一个矩阵).而关于矩形区域的遍历问题经常出现,如“寻找矩阵中的路径”.“找到矩形区域的某个特殊点”等等之类的题目,在 ...

  7. 图的遍历——DFS和BFS模板(一般的图)

    关于图的遍历,通常有深度优先搜索(DFS)和广度优先搜索(BFS),本文结合一般的图结构(邻接矩阵和邻接表),给出两种遍历算法的模板 1.深度优先搜索(DFS) #include<iostrea ...

  8. 图的遍历算法:DFS、BFS

    在图的基本算法中,最初需要接触的就是图的遍历算法,根据访问节点的顺序,可分为深度优先搜索(DFS)和广度优先搜索(BFS). DFS(深度优先搜索)算法 Depth-First-Search 深度优先 ...

  9. 15 图-图的遍历-基于邻接矩阵实现的BFS与DFS算法

    算法分析和具体步骤解说直接写在代码注释上了 TvT 没时间了等下还要去洗衣服 就先不赘述了 有不明白的欢迎留言交流!(估计是没人看的了) 直接上代码: #include<stdio.h> ...

随机推荐

  1. 走在深夜的小码农 Third Day

    Css3 Third Day writer:late at night codepeasant css简介 ​ CSS 是层叠样式表 ( Cascading Style Sheets ) 的简称.​ ...

  2. NB-IoT的数据链路层和上行传输信道类型

    NB-IoT的数据链路层 NB-IoT在LTE系统的基础上对数据链路层进行了大量简化,但整体上还是保持了原有的框架.数据链路层是二层协议,包含了3个子层:MAC子层.RLC子层和PDCP子层. 以网络 ...

  3. Java学习的第十九天

    1.今天学了接口只能有抽象的常量和方法,接口为interface    承接接口是implements 接口的使用 接口中的方法必须是抽象的,没有构造方法 2.今天没有问题 3.明天学习第六章综合实例 ...

  4. MONGODB02 - MongoSocketWriteException 异常会迟到,但从不缺席

    接上一个<MONGODB01 - Prematurely reached end of stream 错误定位及修复>处理完成之后,又报错了,场景也是一段时间不访问MongoDB,突然访问 ...

  5. Linux 系统编程 学习:008-基于socket的网络编程3:基于 TCP 的通信

    背景 上一讲我们介绍了 基于UDP 的通信 这一讲我们来看 TCP 通信. 知识 TCP(Transmission Control Protoco 传输控制协议). TCP是一种面向广域网的通信协议, ...

  6. python数据分析使用matplotlib绘图

    matplotlib绘图 关注公众号"轻松学编程"了解更多. Series和DataFrame都有一个用于生成各类图表的plot方法.默认情况下,它们所生成的是线形图 %matpl ...

  7. python爬虫中的requests模块

    Requests: 让 HTTP 服务人类 一.简介 虽然Python的标准库中 urllib 模块已经包含了平常我们使用的大多数功能,但是它的 API 使用起来让人感觉不太好,而 Requests ...

  8. socket http1

    /*****************************************************************///name          : myhttp.h//funct ...

  9. Java进阶专题(十六) 数据结构与算法的应用(上)

    前言 ​ 学习算法,我们不需要死记硬背那些冗长复杂的背景知识.底层原理.指令语法--需要做的是领悟算法思想.理解算法对内存空间和性能的影响,以及开动脑筋去寻求解决问题的最佳方案.相比编程领域的其他技术 ...

  10. mysql 两主一从环境搭建(5.7.24)

    搭建说明 两主一从,从本质上说,只不过是机器 master-a 和 master-b 互为主从机(热备),然后通过 keepalived 进行高可用配置,使得在同一时间内只会有一台对外提供服务,实现单 ...