这个题可以用tarjan解决,将染色后的点标记为tarjan的那个点,特判如果出发点等于目标点 答案就是1,如果要求的那个点在强连通分量里面,我们就输出其所含的cnt(也就是强连通分量所代表的环的大小)。如果目标点不在强连通分量里,我们就从该点进行扩展,记录下扩展的步数step。如果扩展到一个强连通分量内,答案就是step+该强连通分量的环的大小,break掉即可。最后输出每一个点的答案。

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn=100010;
int n;
int head[maxn],nnext[maxn*2],to[maxn*2];
int tot,top,index,ink;
int dfn[maxn],low[maxn],cnt[maxn],stack[maxn],ans[maxn],color[maxn];
bool b[maxn],instack[maxn];
void add(int x,int y)
{tot++;nnext[tot]=head[x];head[x]=tot;to[tot]=y;
}
void tarjan(int x)
{dfn[x]=low[x]=++index;stack[++top]=x;b[x]=true;instack[x]=true;for(int i=head[x];i;i=nnext[i]){int y=to[i];if(!b[y]){tarjan(y);low[x]=min(low[x],low[y]);}else if(instack[y]){low[x]=min(low[x],low[y]);}}if(dfn[x]==low[x]){int k;do{k=stack[top];instack[k]=false;color[k]=x;top--;}while(stack[top+1]!=x);}
}int main()
{scanf("%d",&n);for(int i=1;i<=n;i++){int tmp;cin>>tmp;add(i,tmp);if(tmp==i) ans[i]=1;}for(int i=1;i<=n;i++){if(!b[i]) {tarjan(i);}}for(int i=1;i<=n;i++){cnt[color[i]]++;}for(int i=1;i<=n;i++){if(cnt[color[i]]!=1){ans[i]=cnt[color[i]];}}    for(int i=1;i<=n;i++){if(ans[i]==0){int step=1;int x=i;while(1){for(int j=head[x];j;j=nnext[j]){x=to[j];}if(ans[x]!=0){ans[i]=step+ans[x];break;}else step++;}}}for(int i=1;i<=n;i++){cout<<ans[i]<<endl;}return 0;
}

【题解】P2921 在农场万圣节(tarjan)相关推荐

  1. 洛谷 P2921 在农场万圣节Trick or Treat on the Farm (tarjan求强连通分量)

    洛谷 P2921 在农场万圣节Trick or Treat on the Farm (tarjan求强连通分量) 题目描述 每年,在威斯康星州,奶牛们都会穿上衣服,收集农夫约翰在N(1<=N&l ...

  2. 洛谷 P2921 在农场万圣节Trick or Treat on the Farm题解

    题意翻译 题目描述 每年,在威斯康星州,奶牛们都会穿上衣服,收集农夫约翰在N(1<=N<=100,000)个牛棚隔间中留下的糖果,以此来庆祝美国秋天的万圣节. 由于牛棚不太大,FJ通过指定 ...

  3. 洛谷[P2921]在农场万圣节

    题目传送门OvO 题目描述 每年,在威斯康星州,奶牛们都会穿上衣服,收集农夫约翰在N(1<=N<=100000)N(1<=N<=100000)N(1<=N<=100 ...

  4. P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm(有环图的搜索)

    P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm 题目描述 Every year in Wisconsin the cows celebrate t ...

  5. 洛谷 P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm

    题目描述 每年,在威斯康星州,奶牛们都会穿上衣服,收集农夫约翰在N(1<=N<=100,000)个牛棚隔间中留下的糖果,以此来庆祝美国秋天的万圣节. 由于牛棚不太大,FJ通过指定奶牛必须遵 ...

  6. P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm

    对于一个牛,它存在两种状态:1.处于联通分量 2.不处于联通分量.对于处于联通分量的牛,求出联通分量的大小:对于不处于联通分量的牛,求出其距离联通分量的路程+联通分量大小. 不同的联通分量,染上不同的 ...

  7. [USACO08DEC]在农场万圣节Trick or Treat on the Farm

    https://www.luogu.org/problemnew/show/P2921 C++版本一 朴素 一.为了实现这一方法,我们对每个点设置两个属性: 1.颜色 (color)(color) : ...

  8. [USACO08DEC]在农场万圣节Trick or Treat on the Farm【Tarja缩点+dfs】

    题目描述 每年,在威斯康星州,奶牛们都会穿上衣服,收集农夫约翰在N(1<=N<=100,000)个牛棚隔间中留下的糖果,以此来庆祝美国秋天的万圣节. 由于牛棚不太大,FJ通过指定奶牛必须遵 ...

  9. Luogu 2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm

    基环树森林,然而我比较菜,直接tarjan找环. 发现缩点之后变成了DAG,每一个点往下走一定会走到一个环,缩点之后搜一遍看看会走到哪个环以及那个环的编号是多少,答案就是环的$siz$$ + $要走的 ...

最新文章

  1. ios开发之UIView的frame、bounds跟center属性的区别(附图)
  2. java.util.Date和java.sql.Date
  3. 别再无聊地吹捧了,一起来动手实现MAE玩玩吧!
  4. csdn中使用Git的一些注意问题
  5. pickle库的使用详解
  6. linux设置ntp开机同步时间同步,linux ntp时间同步
  7. 禁止VirtualBox同步Guest系统的时间
  8. 跟踪slab分配堆栈流程的方法(perf、systemtap)
  9. PHP-阿里云oss使用
  10. uboot中bss的理解
  11. 【算法】阿里双十一推荐技术
  12. 使用GCC和Makefile编译c文件
  13. 征途对计算机配置要求,征途2配置要求是什么?
  14. 环保性能高的家装乳胶漆怎么选择
  15. 追风逐日,Wi-SUN助推新能源数字化
  16. java检查html是否闭合,Java Html解析器和闭合标记
  17. java基础之final关键字_繁星漫天_新浪博客
  18. 远程桌面连接管理器RDCMan教程
  19. 计算机编程语言排行榜—TIOBE世界编程语言排行榜(2020年11月份最新版)
  20. php rot13解密,php对字符串执行ROT13编码的函数str_rot13()

热门文章

  1. const-渣男-直男-暖男的区别
  2. c#的excel边距设置
  3. MarkDown教程画图篇1(typora)
  4. 为什么你的年终绩效总是完不成?
  5. 【upc】PinkRabbit寻找妹子 | 检验dfs序是否合法
  6. 中国新型肥料市场现状分析与投资价值评估报告2022版
  7. Excel合并数据查找函数VLOOKUP()一直显示最后一行数据或者一直报错的解决方法
  8. Python学习第四周第一次作业——用户输入和while循环
  9. MongoDB安装(Linux)
  10. ttylinux的安装部署