• 《洛谷深入浅出基础篇》P3916 图的遍历——逆向搜索


    上链接:

    P3916 图的遍历 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)icon-default.png?t=N7T8https://www.luogu.com.cn/problem/P3916上题干:

    题目描述

    给出 N 个点,M 条边的有向图,对于每个点 v,求 A(v) 表示从点 v 出发,能到达的编号最大的点。

    输入格式

    第 1 行2 个整数 N,M,表示点数和边数。

    接下来 M 行,每行 2 个整数 Ui​,Vi​,表示边 (Ui​,Vi​)。点用 1,2,…,N 编号。

    输出格式

    一行 N 个整数A(1),A(2),…,A(N)。

    输入输出样例

    输入 #1复制

    4 3
    1 2
    2 4
    4 3

    输出 #1复制

    4 4 3 4

    说明/提示

    • 对于 60%60% 的数据,1≤N,M≤10^3。
    • 对于 100%100% 的数据,1≤N,M≤10^5。

     我一开始的想法就是,暴力搜索,每次搜索每个点能到达的最大点。

    像题目所给的数据:(这个表格的是指,是否有这样一条路可以连通某起点和某终点,边权默认为1,若边权为0,则说明没有这样的路)(如果一个点不能到达比他更大的点,那么这个点能到达的最大点为它本身)

    起点\终点1234
    10100
    20001
    30000
    40010

    然后来一个循环,循环n次,代表1~n个点,每个点来一遍dfs。

    然后每次递归更新这个点能到达的最大值 ,直到递归到底部。

    然后我悲催的发现,这样时间复杂度将是爆炸的。

    因为每个点能到达的点的值都会被重复遍历很多次。

    于是我们想起了高中老师经常教我们的:正难则反的思想。

    我们不如让最大值自己去寻找能到达哪些点。

    比如我们先让4(最大值)去找,4能到哪些点。将这些点标记为4.

    然后再让次大值 3(最大值)去寻找,如果找到的点被标记过了,那么就跳过,因为被标记的点一定是上一轮dfs标记的,也就是被比3大的值所标记。

    然后依次类推。

    因为有了标记数组的存在,所以我们遍历的次数大大减少了。

    那么这样让最大值去寻找能被哪些点到达的方法怎么找呢?我们可以反过来建边。

    这样就可以从最大值出发来寻找每个它能到达的点了。

    上代码:

    1. const int N = 1e5 + 7;
    2. const int M = 1e5 + 7;
    3. int n, m;
    4. int flag[N];
    5. vector<int > p[M];
    6. void dfs(int x, int y) {
    7. flag[x] = y;
    8. for (int i = 0; i < p[x].size(); i++) {
    9. if (flag[p[x][i]] == 0){
    10. dfs(p[x][i], y);
    11. }
    12. }
    13. }
    14. int main()
    15. {
    16. cin >> n >> m;
    17. for (int i = 0; i < m; i++)
    18. {
    19. int u, v;
    20. cin >> u >> v;
    21. p[v].push_back(u);
    22. }
    23. for (int i = n; i > 0; i--)
    24. {
    25. if (flag[i] == 0)
    26. dfs(i, i);
    27. }
    28. for (int i = 1; i <= n; i++) {
    29. cout << flag[i] << ' ';
    30. }
    31. }

  • 相关阅读:
    设计模式之工厂方法模式(Factory Method Pattern)
    网络安全行业“专业术语”!
    深度学习之pytorch第一课
    Shader Graph学习各种特效案例
    Centos7 yum方式安装mysql8
    智能网联跑出中国「加速度」,26.15%搭载率背后的市场洗牌
    缺氧诱导因子 HIF在细胞代谢中的作用
    C#使用iText7将多个PDF文档合并为单个文档
    计算机毕业设计JAVAOA办公系统mybatis+源码+调试部署+系统+数据库+lw
    详细解读Latent Diffusion Models:原理和代码
  • 原文地址:https://blog.csdn.net/louisdlee/article/details/134539399