P2921 [USACO08DEC]在农场万圣节

本文介绍了一种使用记搜算法解决特定图论问题的方法。鉴于每个人点的出度仅限于1的特点,文章深入探讨了如何利用这一点简化问题,确保每条边仅属于一个环。通过设置从起点到可达点的总数,文章详细解释了当点位于环中或不在环中时的计算逻辑,并提供了C++代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一道不错的记搜题。

由于每一个人点的出度只能是1,所以我们不难发现:每一条在环上的边只能属于一条环。换句话说:任何一条边顶多属于一个环。这样我们就可以用简单的记搜来实现。

f[i]为从点i开始最多能到达的点的总个数,那么显然,当i在某个环中,f[i]=其他环上的点的f的值;当i不在环中时,f[i]=从i出发最先能到达的环中的点ji的距离+f[j]

具体的实现细节见代码。

Code:

#include<cstdio>
#include<iostream>
using namespace std;

const int MAXN=100020;
int n,nxt[MAXN],fst,dfn[MAXN],huan[MAXN],f[MAXN];

inline int read()
{
	int x=0;
	char ch=getchar();
	while(ch<'0'||'9'<ch)	ch=getchar();
	while('0'<=ch&&ch<='9')
	{
		x=(x <<3)+(x <<1)+(ch-'0');
		ch=getchar();
	}
	return x;
}

void dfs(int x,int tim)
{
	if(nxt[x]==x)	{ f[x]=1; return; }//一定记得判断自环的情况 
	if(f[nxt[x]]>0)  { f[x]=f[nxt[x]]+1; return; }
	dfn[x]=tim;
	if(dfn[nxt[x]]>0)	
	{ 
		huan[x]=1; fst=nxt[x];//huan变量帮助判断当前点是否在环上 
		f[x]=dfn[x]-dfn[nxt[x]]+1; 
		//记录dfs序:当某个点通往一个已被搜到的点nxt[x],说明从nxt[x]到x的路径+单向边w(x,nxt[x])已经构成了一个环。
		//显然这个环的长度=dfn[x]-dfn[nxt[x]]+1;  
		return;
	}
	dfs(nxt[x],tim+1);
	if(huan[nxt[x]]==1)	 
	{ 
		huan[x]=1; f[x]=f[nxt[x]]; 
		if(x==fst)	huan[x]=0;
		return; 
	}
	f[x]=f[nxt[x]]+1;
	return;
}

int main()
{
	n=read();
	for(int i=1;i<=n;i++)	nxt[i]=read();
	for(int i=1;i<=n;i++)
	{
		fst=0;
		if(!dfn[i])	 dfs(i,1);
	}
	for(int i=1;i<=n;i++)	cout<<f[i]<<'\n';
	return 0;
}

 

内容概要:本文介绍了奕斯伟科技集团基于RISC-V架构开发的EAM2011芯片及其应用研究。EAM2011是一款高性能实时控制芯片,支持160MHz主频和AI算法,符合汽车电子AEC-Q100 Grade 2和ASIL-B安全标准。文章详细描述了芯片的关键特性、配套软件开发套件(SDK)和集成开发环境(IDE),以及基于该芯片的ESWINEBP3901开发板的硬件资源和接口配置。文中提供了详细的代码示例,涵盖时钟配置、GPIO控制、ADC采样、CAN通信、PWM输出及RTOS任务创建等功能实现。此外,还介绍了硬件申领流程、技术资料获取渠道及开发建议,帮助开发者高效启动基于EAM2011芯片的开发工作。 适合人群:具备嵌入式系统开发经验的研发人员,特别是对RISC-V架构感兴趣的工程师和技术爱好者。 使用场景及目标:①了解EAM2011芯片的特性和应用场景,如智能汽车、智能家居和工业控制;②掌握基于EAM2011芯片的开发板和芯片的硬件资源和接口配置;③学习如何实现基本的外设驱动,如GPIO、ADC、CAN、PWM等;④通过RTOS任务创建示例,理解多任务处理和实时系统的实现。 其他说明:开发者可以根据实际需求扩展这些基础功能。建议优先掌握《EAM2011参考手册》中的关键外设寄存器配置方法,这对底层驱动开发至关重要。同时,注意硬件申领的时效性和替代方案,确保开发工作的顺利进行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值