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

不同的联通分量,染上不同的颜色,可以计算各个联通分量的大小。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. int vis[];
  5. int low[];
  6. int Loop[],color[],dfn[],head[],ans[],st[], Next[];
  7. int pos;
  8. int k=;
  9. int col;
  10. int top;
  11.  
  12. struct node
  13. {
  14. int v,next;
  15. }edge[];
  16.  
  17. void Add(int u,int v)
  18. {
  19. edge[k].v = v;
  20. edge[k].next = head[u];
  21. head[u] = k++;
  22. }
  23.  
  24. void Find(int root,int x,int step)
  25. {
  26. if(ans[x]!=)
  27. {
  28. ans[root] = ans[x]+step;
  29. return;
  30. }
  31. else
  32. Find(root,Next[x],step+);
  33. }
  34.  
  35. void Tarjan(int u)
  36. {
  37. dfn[u] = low[u] = ++pos;
  38. st[++top] = u;
  39. vis[u] = ;
  40. for(int i=head[u];i!=-;i=edge[i].next)
  41. {
  42. int v = edge[i].v;
  43. if(!dfn[v])
  44. {
  45. Tarjan(v);
  46. low[u] = min(low[u],low[v]);
  47. }
  48. else if(vis[v])
  49. {
  50. low[u] = min(low[u],dfn[v]);
  51. }
  52. }
  53. if(dfn[u] == low[u])
  54. {
  55. col++;
  56. int x;
  57. do{
  58. x = st[top--];
  59. vis[x] = ;
  60. color[x] = col;
  61. }while(x!=u);
  62. }
  63. }
  64.  
  65. int main()
  66. {
  67. memset(head,-,sizeof(head));
  68. int n,v;
  69. scanf("%d",&n);
  70. for(int i=;i<=n;i++)
  71. {
  72. scanf("%d",&v);
  73. Next[i] = v;
  74. Add(i,v);
  75. if(v==i)
  76. ans[i] = ;
  77. }
  78. for(int i=;i<=n;i++)
  79. {
  80. if(!dfn[i])
  81. {
  82. Tarjan(i);
  83. }
  84. }
  85. for(int i=;i<=n;i++)
  86. {
  87. Loop[color[i]]++;
  88. }
  89. for(int i=;i<=n;i++)
  90. {
  91. if(Loop[color[i]]!=)
  92. ans[i] = Loop[color[i]];
  93. }
  94. for(int i=;i<=n;i++)
  95. {
  96. if(ans[i]==)
  97. Find(i,Next[i],);
  98. }
  99. for(int i=;i<=n;i++)
  100. {
  101. printf("%d\n",ans[i]);
  102. }
  103. return ;
  104. }

P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm的更多相关文章

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

    今天我来给大家带来一片蒟蒻题解 ~~真香 LGOJ P2921  [USACO08DEC]在农场万圣节Trick or Treat on the Farm 题目描述 每年,在威斯康星州,奶牛们都会穿上 ...

  2. P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm(Tarjan+记忆化)

    P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm 题意翻译 题目描述 每年,在威斯康星州,奶牛们都会穿上衣服,收集农夫约翰在N(1<=N< ...

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

    P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm 题意翻译 题目描述 每年,在威斯康星州,奶牛们都会穿上衣服,收集农夫约翰在N(1<=N< ...

  4. C++ 洛谷 P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm 题解

    P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm 分析: 这棵树上有且仅有一个环 两种情况: 1.讨论一个点在环上,如果在则答案与它指向点相同, 2 ...

  5. P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm 记忆化搜索dfs

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

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

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

  7. [P2921][USACO08DEC]在农场万圣节Trick or Treat on the Farm (记忆化搜索/DP?,Tarjan?)

    第一看还以为是水题 随便打了一个bfs只有40分…… 然后开始颓废 #include<bits/stdc++.h> #define N 100005 using namespace std ...

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

    题目大意:给你一张有向图,每个点最多一条出边,问从每个开始,走多少步会到一个已经过的点 题解:$tarjan$缩点,然后建反图$DP$ 卡点:无 C++ Code: #include <cstd ...

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

    传送门 解题思路 记忆化搜索,如果搜到环,就将环的大小处理出来. 代码 #include<iostream> #include<cstdio> #include<cstr ...

随机推荐

  1. Python 原生协程------asyncio

    协程 在python3.5以前,写成的实现都是通过生成器的yield from原理实现的, 这样实现的缺点是代码看起来会很乱,于是3.5版本之后python实现了原生的协程,并且引入了async和aw ...

  2. Python中的 sort 和 sorted

    今天在做一道题时,因为忘了Python中sort和sorted的用法与区别导致程序一直报错,找了好久才知道是使用方法错误的问题!现在就大致的归纳一下sort和sorted的用法与区别 1. sort: ...

  3. DAY20、垃圾回收机制,正则模块

    一.垃圾回收机制1.不能被程序访问到的数据,就称之为垃圾2.引用计数:每一次对值地址的引用都可以使该值得引用计数加1 每一次对值地址的释放都可以使该值得引用计数减一 当一个值的引用计数为0时,该值就会 ...

  4. Helicute FPV App Privacy Policy

    Personal Data collected for the following purposes and using the following services: Device permissi ...

  5. placeholder中文字添加换行方法

    需求: 文本域内的提示文字两行显示 解决方案: 表示回车 表示换行 <textarea id="textarea" maxlength="22" plac ...

  6. mac与windows共享键盘鼠标(synergy)

    桌面上有两台电脑, 一台mac一台windows, 由于桌面空间紧张, 放两套键盘鼠标有点浪费空间, 如果能让mac和windows共享键盘鼠标就好了, 经过一番搜寻, 找到了一款名为synergy的 ...

  7. 你需要Mobx还是Redux?

    在过去一年,越来越多的项目继续或者开始使用React和Redux开发,这是目前前端业内很普遍的一种前端项目解决方案,但是随着开发项目越来越多,越来越多样化时,个人又有了不同的感受和想法.是不是因为已经 ...

  8. 第七周java学习总结

    学号 20175206 <Java程序设计>第七周学习总结 教材学习内容总结 第八章: 主要内容 String类 StringTokenizer类 Scanner类 StringBuffe ...

  9. SSL证书安装(Tomcat)腾讯云服务器

    一.SSL证书免费领取地址一年的 https://www.toolmao.com/get-free-ssl 什么你们公司买的?每次免费领取一年,能不能轮流领取没试过.商鸡,商鸡.... 二.下载SSL ...

  10. 计算机网络Web应用层与运输层(HTTP/TCP)

    应用层协议原理 Web和HTTP DNS:英特网的目录服务 运输层 面向连接的运输:TCP及拥塞原理 一.应用层协议原理 DNS域名解析: (用例:www.baidu.com)域名解析是网络请求的第一 ...