一个房间能到另一个房间,有向图,奶牛从自己编号(1到n)的点出发,如果回到以前到过的点就停止,问每头奶牛可以经过几个点;

情况分两种,

一,奶牛在环上,能走的是环的大小,二,一条链连接一个环,大小是链+环;

要预先处理自环的答案(1),还有环的大小是1的(并不在环上的点);

一开始还以为可能出现只有一条链没有环的,但是因为每个点都有一条出边,所以不必担心;

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<stack>
  4. #include<algorithm>
  5. using namespace std;
  6. const int maxn=1e5+;
  7. int pre[maxn*],last[maxn],other[maxn*],l;
  8. stack<int> s;
  9. void add(int x,int y)
  10. {
  11. l++;
  12. pre[l]=last[x];
  13. last[x]=l;
  14. other[l]=y;
  15. }
  16. int belong[maxn];
  17. int qw;
  18. int n;
  19. int ru[maxn];
  20. int cnt,dfn[maxn],low[maxn];
  21. int next[maxn];
  22.  
  23. void dfs(int x)
  24. {
  25. s.push(x);
  26. dfn[x]=low[x]=++cnt;
  27. ru[x]=;
  28. for(int p=last[x];p;p=pre[p])
  29. {
  30. int v=other[p];
  31. if(!dfn[v])
  32. {
  33. dfs(v);
  34. low[x]=min(low[x],low[v]);
  35. }
  36. else if(ru[v])
  37. {
  38. low[x]=min(low[x],dfn[v]);
  39. }
  40. }
  41. if(dfn[x]==low[x])
  42. {
  43. belong[x]=++qw;
  44. while(!s.empty())
  45. {
  46. int y=s.top();
  47. s.pop();
  48. ru[y]=;
  49. belong[y]=qw;
  50. if(y==x) break;
  51. }
  52. }
  53. }
  54. int ring[maxn];
  55. int ans[maxn];
  56.  
  57. void search(int x,int y,int stp)
  58. {
  59. if(ans[y])
  60. {
  61. ans[x]=ans[y]+stp;
  62. return ;
  63. }
  64. else search(x,next[y],stp+);
  65. }
  66.  
  67. int main()
  68. {
  69. scanf("%d",&n);
  70. for(int i=;i<=n;i++)
  71. {
  72. scanf("%d",&next[i]);
  73. add(i,next[i]);
  74. if(next[i]==i) ans[i]=;
  75. }
  76.  
  77. for(int i=;i<=n;i++) if(!dfn[i]) dfs(i);//一定要注意图不一定都联通
  78. for(int i=;i<=n;i++)
  79. {
  80. ring[belong[i]]++;//记录环的大小
  81. }
  82. for(int i=;i<=n;i++)
  83. {
  84. if(ring[belong[i]]!=) ans[i]=ring[belong[i]];
  85. }
  86. for(int i=;i<=n;i++)
  87. {
  88. if(!ans[i]) search(i,next[i],);
  89. }
  90. for(int i=;i<=n;i++)
  91. {
  92. printf("%d\n",ans[i]);
  93. }
  94. return ;
  95. }

tarjan缩点——在农场万圣节Trick or Treat on the Farm的更多相关文章

  1. 缩点【洛谷P2921】 [USACO08DEC]在农场万圣节Trick or Treat on the Farm

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

  2. 「USACO08DEC」「LuoguP2921」在农场万圣节Trick or Treat on the Farm(tarjan

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. 再谈 pm2

    比forever好用,对Ubuntu和centos更友好,性能监控.自动重启.负载均衡,适用于laas场景, 总之,pm2是一个带有负载均衡功能的Node应用的进程管理器,可以实现在云服务器上,对no ...

  2. 日志(log4j2)

    日志测试java代码如下: package com.learn.test; import org.apache.logging.log4j.LogManager; import org.apache. ...

  3. JDBC 复习4 批量执行SQL

    1使用jdbc进行批量执行SQL在实际的项目开发中,有时候需要向数据库发送一批SQL语句执行,这时应避免向数据库一条条的发送执行,而应采用JDBC的批处理机制,以提升执行效率. package dbe ...

  4. 前端关于 superSlide.js 使用,一款基于jquery的前端控件

    1引用jQuery.js 和 jquery.SuperSlide.js 2 编写HTML ** 以下是默认的HTMl结构,分别是 ".hd" 里面包含ul, ".bd&q ...

  5. Windows下使用批处理文件.bat删除旧文件

    本文教大家写一个批处理文件.bat删除旧文件,供大家参考,具体内容如下 1. 批处理文件 del_old_file.bat rem 删除D:\temp目录下7天前的文件Forfiles /p E:\b ...

  6. day12-python之深灰魔法

    #######################################灰魔法: list类中提供的方法   列表####################################### ...

  7. nuxt中全局引入element-ui

    介绍 对于一个前端小白来说,使用一套已有的框架作为基础,可以达到事半功倍的效果,在这里我们选择Element.Element,一套为开发者.设计师和产品经理准备的基于 Vue 2.0 的桌面端组件库( ...

  8. 使用apache的HttpClient进行http通讯,隐藏的HTTP请求头部字段是如何自动被添加的

    我们用apache的HttpClient这个库消费云端的Restful API时,一般都需要两次HTTP调用,第一次获得某种token,比如获取防止跨域请求伪造攻击Cross-site request ...

  9. jeffy-vim-v2.9

    http://pan.baidu.com/s/1qW1DlP6

  10. Annoying Present

    http://codeforces.com/group/1EzrFFyOc0/contest/1009/problem/C 题意:原本有一个n个0的数组a[],你对它进行m次操作,每次操作让a[j]+ ...