当前位置: 首页 > article >正文

蓝桥杯备考:图的遍历

这道题乍一看好像没什么不对的,但是!但是!结点最大可以到10的5次方!!!我们递归的时间复杂度是很高的,我们正常遍历是肯定通过不了的,不信的话我们试一下

#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
const int N = 1e5+10;
int n,m;
vector<int> edges[N];
bool st[N];
int ret;
void dfs(int u)
{
	for(auto&e : edges[u])
	{
		if(!st[e])
		{
			ret = max(ret,e);
			st[e] = true;
			dfs(e);
		}
	}
}
int main()
{
	cin >> n >> m;
	
	for(int i = 1;i<=m;i++)
	{
		int x,y;cin >> x >> y;
		edges[x].push_back(y);
	}
	for(int i =1;i<=n;i++)
	{
		memset(st,false,sizeof(st));
		st[i] = true;
		ret = i;
		dfs(i);
		cout << ret << " ";
	}
	
	
	
	return 0;
}

正着来,我们的时间复杂度很高

如果正着来,我们需要从1开始遍历图一遍,遍历到5再回去找6,从2再来一遍,遍历到1,回去找6,这时候我们的时间复杂度就是N平方,

我们不如把图反过来,反着找,把每次能到达最大点的编号标记上,然后下次再遍历的时候如果某个点已经被标记了就剪掉,时间复杂度就是O(N)

#include <iostream>
#include <vector>
using namespace std;
const int N = 1e5+10;
vector<int> edges[N];
int ret[N];
int n,m;
void dfs(int x,int n)
{
	ret[x] = n;
	for(auto &e : edges[x])
	{
		if(ret[e]) continue;
		ret[e] = n;
		dfs(e,n);
	}
}
int main()
{
	cin >> n >> m;
	for(int i = 1;i<=m;i++)
	{
		int x,y; cin >> x >> y;
		edges[y].push_back(x);
	}
	//上面表示存反图
	for(int i = n;i>=1;i--)
	{
		if(ret[i]) continue;
		dfs(i,i);
	 } 
	
	for(int i =1;i<=n;i++)
	{
		cout << ret[i] << " ";
	}
	
	return 0;
}


http://www.kler.cn/a/599544.html

相关文章:

  • linux去掉绝对路径前面部分和最后的/符号
  • Proteus8打开Proteus7文件(.DSN格式)的方法
  • PyTorch Lightning工业级训练实战
  • Python 迭代器与生成器:深入理解与实践
  • dsPIC33CK64MC105 Curiosity Nano|为高性能数字电源与电机控制而生
  • 软件公司高新技术企业代办:机遇与陷阱并存-优雅草卓伊凡
  • 刷机维修进阶教程-----adb禁用错了系统app导致无法开机 如何保数据无损恢复机型
  • BigEvent项目后端学习笔记(二)文章分类模块 | 文章分类增删改查全流程解析(含优化)
  • python多线程和多进程的区别有哪些
  • Spring Boot整合Activiti工作流详解
  • C++|面试准备二(常考)
  • 【差分隐私相关概念】约束下的列联表边缘分布计算方法
  • 以mysql 为例, 在cmd 命令行连接数据,操作数据库,关闭数据库的详细步骤
  • 【C++进阶学习】第三讲----多态的概念和使用
  • 华为OD机试2025A卷 - 天然蓄水库(Java Python JS C++ C )
  • 链表中倒数第K个节点
  • 地平线AlphaDrive:首个基于GRPO的自动驾驶大模型,仅用20%数据,性能超越SFT 35%!
  • 2025-03-24 学习记录--C/C++-PTA 习题9-1 时间换算
  • unable to load vboxguest kernel module
  • FreeSWITCH入门到精通系列(四):FreeSWITCH模块介绍与使用