【算法】基环树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 ;
}

最新文章

  1. Nancy总结(一)Nancy一个轻量的MVC框架
  2. 【C#】实现按Windows排序方式排序
  3. N-Queens II
  4. python---解决“Unable to find vcvarsall.bat”错误
  5. 40个Android问题
  6. IE layout详解
  7. Role Object(角色对象)
  8. xcode常见错误
  9. 安卓UDP通信
  10. ASP.NET MVC 分页
  11. LeetCode 697. Degree of an Array (数组的度)
  12. Redis 部署主从哨兵 C#使用,实现自动获取redis缓存 实例2
  13. 【一天一道LeetCode】#69. Sqrt(x)
  14. Celery入门指北
  15. topcoder srm 707 div1
  16. Solr高效利用:Solr实现SQL的查询与统计
  17. 修复python命令行下接收不到参数的问题
  18. 【Spring】SpringMVC非注解配置的两种方式
  19. Android.mk(5) 计算怎么办?
  20. SQLite数据库学习小结——Frameworks层实现

热门文章

  1. mysql 复杂查询
  2. 【week2】 词频统计第一次更新
  3. query 获取本身的HTML
  4. 【bzoj1507】[NOI2003]Editor /【bzoj1269】[AHOI2006]文本编辑器editor Splay
  5. openstack之keystone部署
  6. subprocess模块详解
  7. (二)Redis字符串String操作
  8. 1923: [Sdoi2010]外星千足虫
  9. 容器化RDS|计算存储分离 or 本地存储?
  10. 【BZOJ3240】【NOI2013】矩阵游戏(数论)