我们把“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. 删除指定路径下指定天数之前(以文件的最后修改日期为准)的文件:BAT + VBS

    代码如下: @echo off ::演示:删除指定路径下指定天数之前(以文件的最后修改日期为准)的文件. ::如果演示结果无误,把del前面的echo去掉,即可实现真正删除. ::本例调用了临时VBS ...

  2. python数据类型之dict(字典)

    dict字典 关注公众号"轻松学编程"了解更多. 1.概述 dict也是一种存储方式,类似于list和tuple,但是,字典采用键-值(key-value)的形式存储. 优点:具有 ...

  3. 公钥、私钥、SSL/TLS、会话密钥、DES

    一,公钥私钥 1,公钥和私钥成对出现 2,公开的密钥叫公钥,只有自己知道的叫私钥 3,用公钥加密的数据只有对应的私钥可以解密 4,用私钥加密的数据只有对应的公钥可以解密 5,如果可以用公钥解密,则必然 ...

  4. 如何在Windows Server 2012及更高版本中将域控制器降级

    如何在Windows Server 2012及更高版本中将域控制器降级 如果不降级就重装系统,会出问题,所以在将域控系统重装系统之前一定要先降级. 使用服务器管理器将 Windows Server 2 ...

  5. 834. Sum of Distances in Tree —— weekly contest 84

    Sum of Distances in Tree An undirected, connected tree with N nodes labelled 0...N-1 and N-1 edges a ...

  6. MarkDown排版、多样的文本框

    <战争与和平>一八一二年,俄.法两国再度交战,安德烈·保尔康斯基在战役中身受重伤,而俄军节节败退,眼见莫斯科将陷于敌人之手了.罗斯托夫将原本用来搬运家产的马车,改去运送伤兵,娜达莎方能于伤 ...

  7. [Codeforces 553E]Kyoya and Train(期望DP+Floyd+分治FFT)

    [Codeforces 553E]Kyoya and Train(期望DP+Floyd+分治FFT) 题面 给出一个\(n\)个点\(m\)条边的有向图(可能有环),走每条边需要支付一个价格\(c_i ...

  8. Dreamweaver是怎么把图片转换成代码 简单五步骤即可解决

    Dreamweaver图片转换代码图文介绍 1.打开需要转换的Photoshop作品: 2.保存为web格式,得到一个文件夹和一个html格式文件: 3.在html格式文件上单击右键,选择打开方式为D ...

  9. 最全总结 | 聊聊 Python 办公自动化之 Excel(中)

    1. 前言 上一篇文章中,我们聊到使用 xlrd.xlwt.xlutils 这一组合操作 Excel 的方法 最全总结 | 聊聊 Python 办公自动化之 Excel(上) ​本篇文章将继续聊另外一 ...

  10. margin的讲究

    什么元素允许有margin值,无论块状元素还是行内元素都可以,只是各有限制. 先说行内元素,这个是不允许有上下 外边距的, 再说块状元素,上下左右外边距都允许  但是相邻元素的外边距会合并,要注意的是 ...