我们把“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. 如何做好智能家居工业物联网串口转WiFi/4G/以太网无线AP方案的物联网WiFi模块选型

    2020年一场突如其来的灾难袭来,各大经济市场在不同程度被按下了"暂停键".物联网控制作为新兴行业优势凸显出来,其无接触式的交互方式,远程控制,智能控制车间,给人民带来安全.智能的 ...

  2. Java反射:new一个宝可梦吧

    最近写Spring Boot的测试用例会发现经常会有用到@RunWith(SpringRunner.class)的设置注解,关于SpringRunner.class的理解也有点似是而非.其实这种写法是 ...

  3. 【转】Setting up SDL Extension Libraries on Windows

    FROM: http://lazyfoo.net/tutorials/SDL/06_extension_libraries_and_loading_other_image_formats/window ...

  4. 测试可变字符序列stringBuilder

    测试可变字符序列 stringBuilder(线程不安全,效率高,一般用),stringBuffer(线程安全,效率低)stringBuilder,stringBuffer和string的区别前者可变 ...

  5. 4G DTU为什么要具有透传的功能

    4G DTU为什么要透传 透传的目的就是为了在数据传输的过程中不对数据做任何出来,实现发送方和接收方的数据完全一样,长度和内容完全没有变化.它主要是使用在智能设备之间的远程串口数据传输,是一种和传输方 ...

  6. elk部署(实操二)

    续上篇 https://www.cnblogs.com/wangql/p/13373022.html 安装logstash  下载地址:wget https://artifacts.elastic.c ...

  7. Python爬虫练习(requests模块)

    Python爬虫练习(requests模块) 关注公众号"轻松学编程"了解更多. 一.使用正则表达式解析页面和提取数据 1.爬取动态数据(js格式) 爬取http://fund.e ...

  8. 不停机不更新代码线上调试BUG的工具

    如果你有以下痛点,请你查看本文章: 1.我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? 2.遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? 3.线上遇到某个用户的 ...

  9. Python调用飞书发送消息

    一.创建飞书机器人 自定义飞书机器人操作步骤,具体详见飞书官方文档:<机器人 | 如何在群聊中使用机器人?>

  10. php之cms后台文章管理及显示

    public function index(){ C('TOKEN_ON',false);//关闭表单令牌 读取配置 //查询指定id的栏目信息 $id=I('get.id');//类别ID $top ...