《洛谷深入浅出基础篇》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大的值所标记。

然后依次类推。

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

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

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

上代码:

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.mzph.cn/news/156446.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

合并区间(排序、贪心)

LCR 074. 合并区间 - 力扣&#xff08;LeetCode&#xff09; 题目描述 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中…

改进YOLOv8:结合Biformer——基于动态稀疏注意力构建高效金字塔网络架构

🗝️YOLOv8实战宝典--星级指南:从入门到精通,您不可错过的技巧   -- 聚焦于YOLO的 最新版本, 对颈部网络改进、添加局部注意力、增加检测头部,实测涨点 💡 深入浅出YOLOv8:我的专业笔记与技术总结   -- YOLOv8轻松上手, 适用技术小白,文章代码齐全,仅需 …

Unity 场景烘培 ——unity灯光和设置天空盒(二)

提示&#xff1a;文章有错误的地方&#xff0c;还望诸位大神指出。 文章目录 前言一、光源种类1.Directional Light(方向光&#xff0c;平行光)2.Point Light&#xff08;点光源&#xff09;3.Spotlight&#xff08;聚光灯&#xff09;4.Area Light&#xff08;区域光&#xff…

【C++】——多态性与模板(其二)

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

import.meta.glob() 如何导入多个目录下的资源

import.meta.glob() 如何导入多个目录下的资源 刚开始用 vite&#xff0c;在做动态路由的时候遇到了这个问题&#xff0c;看到其它教程上都是只引用了一个目录层级的内容&#xff0c;比如这样&#xff1a; let RouterModules import.meta.glob("/src/view/*/*.vue"…

vue3中使用全局自定义指令和组件自定义指令

这篇文章会教大家如何实现全局自定义指令和组件自定义指令 &#x1f4d3;全局自定义指令和组件自定义指令的区别&#xff0c;除了写法不同和作用不同&#xff0c;其他的包括生命周期的使用方法都是一致的&#xff0c;全局自定义指令在main.ts中注册后整个项目都可以使用&#x…

简述几个我们对Redis 7开源社区所做的贡献

Redis 7 已经于2022年4月28号正式发布&#xff0c;其中包括了将近50个新的命令&#xff0c;增加了许多新的特性&#xff0c;并且在整个Redis 6到Redis 7的开发过程中&#xff0c;我也对Redis 的开源社区贡献了一些微薄的力量。在这篇文章中&#xff0c;我来给大家介绍几个自己亲…

STM32定时器输入捕获测量高电平时间

STM32定时器输入捕获测量高电平时间 输入捕获测量高电平时间CuebMX配置代码部分 本篇内容要求读者对STM32通用定时器有一点理解&#xff0c;如有不解&#xff0c;请看 夜深人静学32系列15——通用定时器 输入捕获 输入捕获是STM32通用定时器的一种功能&#xff0c;可以捕获特定…

axios 请求合集

post 请求 请求负载请求参数&#xff08;Request Payload&#xff09; import axios from axios import qs from query-stringexport function getRoles(data){return axios.post(目标地址,data,{headers:{Content-Type: application/json,},}) }表单请求参数&#xff08;Form…

OGG-01224 Address already in use 问题

ERROR OGG-01224 Oracle GoldenGate Manager for Oracle, mgr.prm: Address already in use. ERROR OGG-01668 Oracle GoldenGate Manager for Oracle, mgr.prm: PROCESS ABENDING. 查看端口被占用情况&#xff1a; [rootcenterone ogg]# lsof -i:7809原因mgr 7809 端口被占…

Spring-IOC-@Value和@PropertySource用法

1、Book.java PropertySource(value"classpath:配置文件地址") 替代 <context:property-placeholder location"配置文件地址"/> Value("${book.bid}") Value("${book.bname}") Value("${book.price}") <bean id&…

MS90C386:+3.3V 175MHz 的 24bit 平板显示器(FPD)LVDS 信号接收器

产品简述 MS90C386 芯片能够将 4 通道的低压差分信号&#xff08; LVDS &#xff09;转换成 28bit 的 TTL 数据。时钟通道与数据通道并行输入。在时钟频率 为 175MHz 时&#xff0c; 24bit 的 RGB 数据、 3bit 的 LCD 时序数据和 1bit 的控制数据以 1225Mb…

Es 拼音搜索无法高亮

目录 背景&#xff1a; Es 版本&#xff1a; 第一步 第二步 &#xff08;错误步骤 - 只是记录过程&#xff09; 第三步 第四步 第五步 第六步 第七步 背景&#xff1a; app 原有的搜索功能无法进行拼音搜索&#xff0c;产品希望可以支持&#xff0c;例如内容中含有&a…

c++|内联函数

一、概念 以inline修饰的函数叫做内联函数&#xff0c;编译时c编译器会在调用函数的地方展开&#xff0c;而不会建立栈帧&#xff0c;提升了程序运行的效率 例子&#xff1a; #include <iostream> using namespace std;int Add(int left, int right) {return left - ri…

配置环境-insightface-torch

1. 创建环境&#xff1a;conda create -n insightface2 python3.8 2.安装pytorch: 我的cuda 是 11.3 然后进入 pytorch 官网查找对应cuda 版本 pytorch 安装 建议使用 pip # CUDA 11.3 conda install pytorch1.12.1 torchvision0.13.1 torchaudio0.12.1 cudatoolkit11.3 -…

Spring5从入门到精通(一)

1.IOC容器 2.AOP面向切面编程 3. 声明事务&#xff1b; 4. 注解的方式启动对我们后期学习SpringBoot有非常大帮助&#xff1b; 5. 整合SpringMVC 和Mybatis&#xff1b; 6. Spring5新特性&#xff1b; JDK最低版本要求1.8 Spring概念 Spring是一个JavaEE开源的轻量级别…

勒索病毒最新变种.mkp勒索病毒来袭,如何恢复受感染的数据?

引言&#xff1a; 随着网络技术的不断发展&#xff0c;勒索病毒已经成为数字时代的威胁之一&#xff0c;而MKP勒索病毒正是其中之一。本文将深入介绍MKP勒索病毒的特点&#xff0c;讨论恢复被加密数据的方法&#xff0c;并提供预防措施&#xff0c;以帮助用户和组织更好地保护…

openGauss学习笔记-127 openGauss 数据库管理-设置账本数据库-修复账本数据库

文章目录 openGauss学习笔记-127 openGauss 数据库管理-设置账本数据库-修复账本数据库127.1 前提条件127.2 背景信息127.3 操作步骤 openGauss学习笔记-127 openGauss 数据库管理-设置账本数据库-修复账本数据库 127.1 前提条件 系统中需要有审计管理员或者具有审计管理员权…

Leetcode_48:旋转图像

题目描述&#xff1a; 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],…

连接数据库

在xml里 "jdbc:mysql://localhost:3306/db_xiaoqi?characterEncodingutf8&amp;useSSLfalse&amp;serverTimezoneUTC&amp;rewriteBatchedStatementstrue".properties配置文件 drivercom.mysql.cj.jdbc.Driver urljdbc:mysql://localhost:3306/mybatis_s…