基环树森林,然而我比较菜,直接tarjan找环。

发现缩点之后变成了DAG,每一个点往下走一定会走到一个环,缩点之后搜一遍看看会走到哪个环以及那个环的编号是多少,答案就是环的$siz$$ + $要走的路程。

比较垃圾的我忘记了判重边WA了好多发……

时间复杂度$O(n)$。

Code:

#include <cstdio>
#include <cstring>
using namespace std;const int N = 1e5 + 5;
const int inf = 1 << 30;int n, to[N], dfsc = 0, dfn[N], low[N], cur[N];
int scc = 0, siz[N], top = 0, sta[N], bel[N], dis[N];
int tot = 0, head[N];
bool vis[N], isCur[N];struct Edge {int to, nxt;
} e[N];inline void add(int from, int ver) {e[++tot].to = ver;e[tot].nxt = head[from];head[from] = tot;
}inline void read(int &X) {X = 0; char ch = 0; int op = 1;for(; ch > '9'|| ch < '0'; ch = getchar())if(ch == '-') op = -1;for(; ch >= '0' && ch <= '9'; ch = getchar())X = (X << 3) + (X << 1) + ch - 48;X *= op;
}inline int min(int x, int y) {return x > y ? y : x;
}inline int max(int x, int y) {return x > y ? x : y;
}void tarjan(int x) {dfn[x] = low[x] = ++dfsc;sta[++top] = x, vis[x] = 1;int y = to[x];if(!dfn[y]) {tarjan(y);low[x] = min(low[x], low[y]);} else if(vis[y]) low[x] = min(low[x], dfn[y]);if(low[x] == dfn[x]) {++scc;for(; sta[top + 1] != x; --top) {bel[sta[top]] = scc;siz[scc]++;vis[sta[top]] = 0;}}
}void dfs(int x) {vis[x] = 1;if(isCur[x]) {dis[x] = 0, cur[x] = x;return;}for(int i = head[x]; i; i = e[i].nxt) {int y = e[i].to;if(!vis[y]) dfs(y);dis[x] = dis[y] + 1, cur[x] = cur[y];}
}int main() {
//    freopen("testdata.in", "r", stdin);
//    freopen("mine.out", "w", stdout);
    read(n);for(int i = 1; i <= n; i++) read(to[i]);for(int i = 1; i <= n; i++)if(!dfn[i]) tarjan(i);/*    for(int i = 1; i <= n; i++)printf("%d ", bel[i]);printf("\n");   */for(int i = 1; i <= n; i++)if(to[i] == i) isCur[bel[i]] = 1;for(int i = 1; i <= scc; i++) if(siz[i] >= 2) isCur[i] = 1;for(int i = 1; i <= n; i++) {if(bel[i] == bel[to[i]]) continue;add(bel[i], bel[to[i]]);}    for(int i = 1; i <= scc; i++)if(!vis[i]) dfs(i);/*    for(int i = 1; i <= scc; i++)printf("%d ", cur[i]);printf("\n");   */for(int i = 1; i <= n; i++) {if(isCur[bel[i]]) printf("%d\n", siz[bel[i]]);else printf("%d\n", dis[bel[i]] + siz[cur[bel[i]]]);}return 0;
}

View Code

转载于:https://www.cnblogs.com/CzxingcHen/p/9595345.html

Luogu 2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm相关推荐

  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. [USACO08DEC]在农场万圣节Trick or Treat on the Farm

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

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

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

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

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

  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. BZOJ 1589 Trick or Treat on the Farm (tarjan缩点,记忆化搜索)[Usaco 2008 Dec Gold]【BZOJ计划】

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

  9. bzoj千题计划161:bzoj1589: [Usaco2008 Dec]Trick or Treat on the Farm 采集糖果

    http://www.lydsy.com/JudgeOnline/problem.php?id=1589 tarjan缩环后拓扑排序上DP #include<cstdio> #includ ...

最新文章

  1. swift_005(Swift的Dictionary 字典)
  2. Android应用安全开发之浅谈加密算法的坑
  3. 网站系统安全防护体系建设方案
  4. python 正则学习笔记
  5. PHP的SESSION使用,文件上传下载等
  6. 知识图谱中的关系方向与强度研究
  7. HDU 2255 - 奔小康赚大钱
  8. 幼儿抽象逻辑思维举例_四个锻炼幼儿推理能力的小游戏,让孩子的逻辑思维更上一层楼...
  9. 世界很大,一定要出去看看
  10. 15款Chrome浏览器插件让设计师告别拖延症
  11. 甘恒通:腾讯信鸽海量移动推送服务构建
  12. 硬件开发总结笔记一:电阻
  13. 在python中gevent monkey_patch 出现Monkey-patching may lead to errors解决
  14. windows 配置域名
  15. 损失函数、代价函数和目标函数的区别
  16. Mysql索引介绍及使用注意事项,limit分页查询,慢查询分析
  17. 个人免费可访问网页制作【GitHub】及其二维码制作(需要有网页源码)——论前端的浪漫
  18. Python 爬虫基础
  19. WIN10 启动后花屏
  20. python爬取大众点评_Python爬虫,获取大众点评上海地区的餐饮信息!

热门文章

  1. 关于模型复杂度的一个想法
  2. python有用知识
  3. Mach-O 的动态链接(Lazy Bind 机制)
  4. C#枚举类型和结构体
  5. VBS递归遍历文件夹
  6. Ajax实战:Ajax的四个基本原则
  7. 【51nod】2590 持续讨伐
  8. YOLO训练Pedestrain
  9. FreeRTOS初步认识
  10. 现在不坚持,以后都会放弃