【BZOJ】1589: [Usaco2008 Dec]Trick or Treat on the Farm 采集糖果
2024-08-25 10:09:01
【算法】基环树DP
【题意】给定若干有向基环树,每个点能走的最远路径长度。
【题解】
参考:【BZOJ1589】Trick or Treat on the Farm 基环树裸DP by 空灰冰魂
考虑DAG上DP,令f[x]表示点x开始能到达的最远长度,则f[x]=f[y]+1,x--->y。
环套树最重要的操作就是找环,可以用tarjan缩点,也可以用简单的找环写。
找环:在vis上给访问过的点标号,从每个未访问过的点开始遍历,用栈存储路上的点,遇到vis标号相同的点说明找到环,然后弹出。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=; int nex[maxn],s[maxn],n,f[maxn],top,vis[maxn];
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++)scanf("%d",&nex[i]);
for(int i=;i<=n;i++)if(!vis[i]){
int j=i;
top=;
while(!vis[j]){
vis[j]=i;
s[++top]=j;
j=nex[j];
}
if(vis[j]==i){
int cnt=;
while(s[top-cnt+]!=j)cnt++;
for(int k=;k<=cnt;k++)f[s[top-k+]]=cnt;
top-=cnt;
}
int k=;
while(top>)f[s[top--]]=f[j]+(++k);
}
for(int i=;i<=n;i++)printf("%d\n",f[i]);
return ;
}
最新文章
- Nancy总结(一)Nancy一个轻量的MVC框架
- 【C#】实现按Windows排序方式排序
- N-Queens II
- python---解决“Unable to find vcvarsall.bat”错误
- 40个Android问题
- IE layout详解
- Role Object(角色对象)
- xcode常见错误
- 安卓UDP通信
- ASP.NET MVC 分页
- LeetCode 697. Degree of an Array (数组的度)
- Redis 部署主从哨兵 C#使用,实现自动获取redis缓存 实例2
- 【一天一道LeetCode】#69. Sqrt(x)
- Celery入门指北
- topcoder srm 707 div1
- Solr高效利用:Solr实现SQL的查询与统计
- 修复python命令行下接收不到参数的问题
- 【Spring】SpringMVC非注解配置的两种方式
- Android.mk(5) 计算怎么办?
- SQLite数据库学习小结——Frameworks层实现