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

news/2024/7/15 18:08:34 标签: 算法, c++, 图论, 深度优先

上链接:

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大的值所标记。

然后依次类推。

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

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

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

上代码:

const int N = 1e5 + 7;
const int M = 1e5 + 7;
int n, m;
int flag[N];
vector<int > p[M];

void dfs(int x, int y) {
    flag[x] = y;
    for (int i = 0; i < p[x].size(); i++) {
        if (flag[p[x][i]] == 0){
            dfs(p[x][i], y);
        }
    }
}
int main()
{
    cin >> n >> m;
    for (int i = 0; i < m; i++)
    {
        int u, v;
        cin >> u >> v;
        p[v].push_back(u);
    }
    for (int i = n; i > 0; i--)
    {
        if (flag[i] == 0)
            dfs(i, i);
    }
    for (int i = 1; i <= n; i++) {
        cout << flag[i] << ' ';
    }
}

 


http://www.niftyadmin.cn/n/5201616.html

相关文章

OpenAI宣布暂停ChatGPT plus用户订阅,解决方案,无需等待立马升级

作为人工智能领域的一项重要革新&#xff0c;ChatGPT Plus的上线引起了众多用户的关注&#xff0c;其背后的OpenAI表现出傲娇的态度&#xff0c;被誉为下一个GTP 4.0。总的来说&#xff0c;ChatGPT Plus的火爆主要有两个原因。首先&#xff0c;其在人工智能对话技术领域的创新&…

家政保洁预约小程序app开发特点有哪些?

家政预约服务小程序APP开发的特点介绍&#xff1b; 1. 低成本&#xff1a;用户通过手机APP下单&#xff0c;省去了中介费用&#xff0c;降低了雇主的雇佣成本。 2. 高收入&#xff1a;家政服务人员通过手机APP接单&#xff0c;省去了中介费用&#xff0c;从而提高了服务人员的…

比赛调研资料

视觉文旅 现有的模型 数据 功能 精准营销 基于地理推荐能力 乡村圈分析能力 都市圈分析能力 产品体系 三大数据平台 携程问道 旅游服务框架&#xff1a;前置&#xff08;推荐种草&#xff09;&#xff0c;途中&#xff08;客服&#xff09;&#xff0c;售后&#xff0…

【PTA题目】L1-4 稳赢 分数 15

L1-4 稳赢 分数 15 全屏浏览题目 切换布局 作者 陈越 单位 浙江大学 大家应该都会玩“锤子剪刀布”的游戏&#xff1a;两人同时给出手势&#xff0c;胜负规则如图所示&#xff1a; 现要求你编写一个稳赢不输的程序&#xff0c;根据对方的出招&#xff0c;给出对应的赢招。但…

【智能优化算法】从蚁群到动物园

目录 引言蚁群优化算法&#xff08;ACO&#xff09;ACO 机理ACO 模型描述ACO 移动策略 粒子群优化算法&#xff08;PSO&#xff09;PSO 机理PSO 模型描述 萤火虫群优化算法&#xff08;GSO&#xff09;GSO 机理GSO 模型描述 群智能优化算法 引言 21世纪&#xff0c;人类社会已经…

基于Python+TensorFlow+Django的交通标志识别系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 随着交通网络的不断扩展和智能交通系统的发展&#xff0c;交通标志的自动识别变得愈发重要。本项目旨在利用Python编…

Django 入门学习总结4

视图是Django应用程序在Python语言中提供特定的方法并对应于有特定的模板的网页。网页的页面通过视图的方式进行跳转。 在投票系统中&#xff0c;有四个视图&#xff1a; 首页视图&#xff0c;显示最新的问题列表。细节视图&#xff0c;显示问题文本&#xff0c;通过表单可以…

【力扣】 209. 长度最小的子数组

【力扣】 209. 长度最小的子数组 文章目录 【力扣】 209. 长度最小的子数组1. 题目介绍2. 解法2.1 暴力求解2.2 前缀和 二分查找2.3 滑动窗口2.4 贪心回溯 3. Danger参考 1. 题目介绍 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 …