我们把“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. 关于机器翻译评价指标BLEU(bilingual evaluation understudy)的直觉以及个人理解

    最近我在做Natural Language Generating的项目,接触到了BLEU这个指标,虽然知道它衡量的是机器翻译的效果,也在一些文献的experiment的部分看到过该指标,但我实际上经常 ...

  2. Java学习的第三天

    1.今天学了main函数具体的解读如 main函数关键字的意义 变量命名 2.在2.1当中的cmd命令实施失败,文件路径没有找到. 3.明天学习变量范围和注释阅读大道至简.

  3. 【应用程序见解 Application Insights】Application Insights 使用 Application Maps 构建请求链路视图

    Applicaotn  Insigths 使用 Application Maps 构建请求链路视图 构建系统时,请求的逻辑操作大多数情况下都需要在不同的服务,或接口中完成整个请求链路.一个请求可以经历 ...

  4. C的输入&输出

    格式说明符 输出 %d整型输出,%ld长整型输出, %o以八进制数形式输出整数, %x以十六进制数形式输出整数,或输出字符串的地址. %u以十进制数输出unsigned型数据(无符号数).注意:%d与 ...

  5. 十个Pycharm快捷键——提升效率

    一些比较实用的Pycharm的快捷键,提升编写开发效率. 1.解除语法限制 默认情况下,Pycharm会对代码进行检查,包括但不仅限于代码是否有语法错误,是否符合PEP8规范. 如命名检查,如下图 变 ...

  6. layui tempalte添加函数

    @*超链接action展示*@ <script type="text/html" id="ShowAction"> {{# if(d.DealSta ...

  7. lambda表达式的distinct去重

    天真的我最开始以为可以写成list.distinct(x=>x.name);以为这样就可以按照name去重了,结果是不行的.这里记录下正确的用法. 1.这里是针对int集合  可以满足 #reg ...

  8. 第一次本地代码提交到github

    1.在个github上创建一个库 2.创建成功后,可以看到自己的仓库地址 3.在本地新建一个文件夹,并通过个git clone将仓库克隆到本地,并进入文件夹下 4.将需要提交的代码放入文件下,然后在终 ...

  9. 机器学习-logistic对数回归求参数,画散点图以及分割线

    这个在我初学的时候我也不是很明白,于是在查了很多资料后找到一个很不错的博客给大家分享一下!! 研读一下代码对初学者有很大的帮助 作为一个初学者,一开始都是模仿别人的代码学会后就成为自己的东西了,相信你 ...

  10. 315. Count of Smaller Numbers After Self(二分或者算法导论中的归并求逆序数对)

    You are given an integer array nums and you have to return a new counts array. The counts array has ...