缩成DAG

f(i)表示以i为起点的最长路

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
#define N 100001
int n,To[N],mem[N];
vector<int>vs;
int v[N],first[N],next[N],en;
void AddEdge(int U,int V)
{
v[++en]=V;
next[en]=first[U];
first[U]=en;
}
int v2[N],firs2[N],nex2[N],e2;
void AddEdg2(int U,int V)
{
v2[++e2]=V;
nex2[e2]=firs2[U];
firs2[U]=e2;
}
int w[N],cmp[N],tot;
bool vis[N];
void dfs(int U)
{
vis[U]=1;
for(int i=first[U];i;i=next[i])
if(!vis[v[i]])
dfs(v[i]);
vs.push_back(U);
}
void df2(int U)
{
cmp[U]=tot;
++w[tot];
for(int i=firs2[U];i;i=nex2[i])
if(!cmp[v2[i]])
df2(v2[i]);
}
void scc()
{
for(int i=1;i<=n;++i)
if(!vis[i])
dfs(i);
vector<int>::iterator it=vs.end(); --it;
while(1)
{
if(!cmp[*it])
{
++tot;
df2(*it);
}
if(it==vs.begin())
break;
--it;
}
}
int f(int U)
{
if(mem[U]) return mem[U];
mem[U]=w[U];
for(int i=first[U];i;i=next[i])
mem[U]=max(mem[U],f(v[i])+w[U]);
return mem[U];
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;++i)
{
scanf("%d",&To[i]);
AddEdge(i,To[i]);
AddEdg2(To[i],i);
}
scc();
memset(first,0,sizeof(first));
memset(next,0,sizeof(next));
memset(v,0,sizeof(v));
en=0;
for(int i=1;i<=n;++i)
if(cmp[i]!=cmp[To[i]])
AddEdge(cmp[i],cmp[To[i]]);
for(int i=1;i<=n;++i)
printf("%d\n",f(cmp[i]));
return 0;
}

最新文章

  1. sizeof strlen strncpy用法总结 结构体实际所占内存大小 以及memset用法
  2. 精通iOS开发(第5版)
  3. 进程间通讯aidl
  4. 固定表格行列(expression)
  5. Topself 方便调试的Window服务框架
  6. java几种常用设计模式简单示例
  7. Monkey and Banana(基础DP)
  8. 将 Callout 容器添加到移动设备应用程序中
  9. java算法 蓝桥杯 扶老奶奶街
  10. Java 从键盘输入
  11. DRAM的原理设计
  12. 关于Python的Mixin模式
  13. [C++]环状序列(CircularSequence,ACM/ICPC Seoul 2004,UVa1584)
  14. android.view.WindowManager$BadTokenException: Unable to add window
  15. 在Mac上安装GTK(go语言GUI)
  16. 日志框架学习(log4j2+slf4j)
  17. C#调用haskell遭遇Attempted to read or write protected memory
  18. Linux文件与目录操作
  19. java 获取局域网中的全部主机名和IP地址
  20. 转载:Spring学习总结

热门文章

  1. 普通table表格样式及代码大全
  2. centos yum 安装 mysql
  3. C++ 智能指针的简单实现
  4. 【Foreign】石子游戏 [博弈论]
  5. 【BZOJ4031】【HEOI2015】小Z的房间 [Matrix-Tree][行列式]
  6. [bzoj1031][JSOI2007]字符加密Cipher——后缀数组
  7. unicode字符串解码显示
  8. POJ2255(二叉树遍历)
  9. Google Breakpad: 实战crash .
  10. 兼容IE的超出文字隐藏