题目描述

每年,在威斯康星州,奶牛们都会穿上衣服,收集农夫约翰在N(1<=N<=100,000)个牛棚隔间中留下的糖果,以此来庆祝美国秋天的万圣节。
由于牛棚不太大,FJ通过指定奶牛必须遵循的穿越路线来确保奶牛的乐趣。为了实现这个让奶牛在牛棚里来回穿梭的方案,FJ在第i号隔间上张贴了一个“下一个隔间”Next_i(1<=Next_i<=N),告诉奶牛要去的下一个隔间;这样,为了收集它们的糖果,奶牛就会在牛棚里来回穿梭了。
FJ命令奶牛i应该从i号隔间开始收集糖果。如果一只奶牛回到某一个她已经去过的隔间,她就会停止收集糖果。
在被迫停止收集糖果之前,计算一下每头奶牛要前往的隔间数(包含起点)。
(翻译来自洛谷)

分析

比较容易可以想到,如果一个奶牛位于一个环中,那么它的答案就是这个环的大小。
如果一个奶牛不在一个环中,那么答案就是到它最近的环的距离再加上环的大小。

代码

#include <bits/stdc++.h>
#define ll long long
#define ms(a, b) memset(a, b, sizeof(a))
#define inf 0x3f3f3f3f
#define db double
#define N 100005
using namespace std;
template <typename T>
inline void read(T &x) {x = 0; T fl = 1; char ch = 0;for (; ch < '0' || ch > '9'; ch = getchar())if (ch == '-') fl = -1;for (; ch >= '0' && ch <= '9'; ch = getchar())x = (x << 1) + (x << 3) + (ch ^ 48);x *= fl;
}
struct edge {int to, nt;
}E[N];
int H[N], dfn[N], vis[N], S[N], nxt[N], belong[N], low[N], ans[N], sum[N];
int scc, cnt, dfn_tot, top, n;
void add_edge(int u, int v) {E[++ cnt] = (edge){v, H[u]};H[u] = cnt;
}
void tarjan(int u) {vis[u] = 1;low[u] = dfn[u] = ++ dfn_tot;S[top ++] = u;for (int e = H[u]; e; e = E[e].nt) {int v = E[e].to;if (!dfn[v]) tarjan(v), low[u] = min(low[u], low[v]);else if (vis[v]) low[u] = min(low[u], low[v]);}int j;if (dfn[u] == low[u]) {scc ++;do {j = S[-- top];belong[j] = scc;vis[j] = 0;} while (u != j);}
}
void dfs(int u, int nt, int dis) {if (ans[nt] != 0) {ans[u] = ans[nt] + dis;return;}else dfs(u, nxt[nt], dis + 1);
}
int main() {read(n);for (int i = 1; i <= n; i ++) {read(nxt[i]);add_edge(i, nxt[i]);if (nxt[i] == i) ans[i] = 1;}for (int i = 1; i <= n; i ++) if (!dfn[i]) tarjan(i);for (int i = 1; i <= n; i ++) sum[belong[i]] ++;for (int i = 1; i <= n; i ++) if (sum[belong[i]] != 1) ans[i] = sum[belong[i]];for (int i = 1; i <= n; i ++) if (ans[i] == 0) dfs(i, nxt[i], 1);for (int i = 1; i <= n; i ++) printf("%d\n", ans[i]);return 0;
}

转载于:https://www.cnblogs.com/chhokmah/p/10634472.html

[USACO08DEC]在农场万圣节Trick or Treat on the Farm【Tarja缩点+dfs】相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. TZOJ:2592 Trick or Treat on the Farm(tarjan求最大闭合路径)

    题目链接:TZOJ:2592Trick or Treat on the Farm 题面: 样例输入: 4 1 3 2 3 样例输出: 1 2 2 3 该题的图和TZOJ:6024信息传递的图几乎一模一 ...

  9. BZOJ 1589 Trick or Treat on the Farm (tarjan缩点,记忆化搜索)[Usaco 2008 Dec Gold]【BZOJ计划】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Weblink https://hydro.ac/d/bzoj/p/1589 Problem 每年万圣 ...

最新文章

  1. 凤凰城将很快迎来无人驾驶汽车
  2. 虚拟机上无法运行Gazebo的问题?
  3. MATLAB应用实战系列(七十六)-【仿真应用】卡尔曼滤波在雷达目标跟踪中的应用仿真(附matlab代码)
  4. linux ubuntu安装教程6,64位Ubuntu下安装IE6步骤
  5. pthread_create函数 参数不匹配的问题
  6. Object address check - Jurisdiction code
  7. lcd刷新慢_LCD1602刷新率很慢的问题
  8. stream获取filter
  9. [html] 你有使用过ins标签吗?说说它的用途
  10. Linux Note
  11. Spring boot admin 升级到2.3.1 遇到的问题总结
  12. D-News|英特尔首推融合现实,亚马逊云服务市场占比超3成
  13. python中几个常用的算术函数
  14. Spring中的@Autowired自动装配
  15. 在几何画板中如何制作圆柱的侧面展开动画_几何画板制作圆柱展开图过程详解...
  16. 空间换时间,轻松提高性能100倍
  17. mysql 父子关系查询,父子关系-SQL查询
  18. idea启动时加载完卡住的解决办法
  19. GC—MS常见数据库有哪些,NIST和AMDIS有什么作用?
  20. Unity3D绘制两圆柱体相贯线

热门文章

  1. 如何成为数字化人才?
  2. android最新版本6,keep安卓官方最新版
  3. redo和undo日志
  4. WordPress初学者入门教程-分类和标签
  5. linux搭建音视频服务器,Linux平台部署音视频SDK实现即时通讯功能
  6. 房地产行业如何轻松实现数据可视化
  7. 【C语言】如何理解【void(*)(void)】
  8. COLLATE utf8_general_ci;是什么意思?
  9. vscode连接电脑虚拟机上的ubuntu
  10. LearnOpenGL->光照->投光物/多光源