Luogu 2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm
基环树森林,然而我比较菜,直接tarjan找环。
发现缩点之后变成了DAG,每一个点往下走一定会走到一个环,缩点之后搜一遍看看会走到哪个环以及那个环的编号是多少,答案就是环的$siz$$ + $要走的路程。
比较垃圾的我忘记了判重边WA了好多发……
时间复杂度$O(n)$。
Code:
![](/assets/blank.gif)
![](/assets/blank.gif)
#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相关推荐
- P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm(有环图的搜索)
P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm 题目描述 Every year in Wisconsin the cows celebrate t ...
- [USACO08DEC]在农场万圣节Trick or Treat on the Farm
https://www.luogu.org/problemnew/show/P2921 C++版本一 朴素 一.为了实现这一方法,我们对每个点设置两个属性: 1.颜色 (color)(color) : ...
- 洛谷 P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm
题目描述 每年,在威斯康星州,奶牛们都会穿上衣服,收集农夫约翰在N(1<=N<=100,000)个牛棚隔间中留下的糖果,以此来庆祝美国秋天的万圣节. 由于牛棚不太大,FJ通过指定奶牛必须遵 ...
- [USACO08DEC]在农场万圣节Trick or Treat on the Farm【Tarja缩点+dfs】
题目描述 每年,在威斯康星州,奶牛们都会穿上衣服,收集农夫约翰在N(1<=N<=100,000)个牛棚隔间中留下的糖果,以此来庆祝美国秋天的万圣节. 由于牛棚不太大,FJ通过指定奶牛必须遵 ...
- P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm
对于一个牛,它存在两种状态:1.处于联通分量 2.不处于联通分量.对于处于联通分量的牛,求出联通分量的大小:对于不处于联通分量的牛,求出其距离联通分量的路程+联通分量大小. 不同的联通分量,染上不同的 ...
- 洛谷 P2921 在农场万圣节Trick or Treat on the Farm (tarjan求强连通分量)
洛谷 P2921 在农场万圣节Trick or Treat on the Farm (tarjan求强连通分量) 题目描述 每年,在威斯康星州,奶牛们都会穿上衣服,收集农夫约翰在N(1<=N&l ...
- 洛谷 P2921 在农场万圣节Trick or Treat on the Farm题解
题意翻译 题目描述 每年,在威斯康星州,奶牛们都会穿上衣服,收集农夫约翰在N(1<=N<=100,000)个牛棚隔间中留下的糖果,以此来庆祝美国秋天的万圣节. 由于牛棚不太大,FJ通过指定 ...
- BZOJ 1589 Trick or Treat on the Farm (tarjan缩点,记忆化搜索)[Usaco 2008 Dec Gold]【BZOJ计划】
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Weblink https://hydro.ac/d/bzoj/p/1589 Problem 每年万圣 ...
- 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 ...
最新文章
- swift_005(Swift的Dictionary 字典)
- Android应用安全开发之浅谈加密算法的坑
- 网站系统安全防护体系建设方案
- python 正则学习笔记
- PHP的SESSION使用,文件上传下载等
- 知识图谱中的关系方向与强度研究
- HDU 2255 - 奔小康赚大钱
- 幼儿抽象逻辑思维举例_四个锻炼幼儿推理能力的小游戏,让孩子的逻辑思维更上一层楼...
- 世界很大,一定要出去看看
- 15款Chrome浏览器插件让设计师告别拖延症
- 甘恒通:腾讯信鸽海量移动推送服务构建
- 硬件开发总结笔记一:电阻
- 在python中gevent monkey_patch 出现Monkey-patching may lead to errors解决
- windows 配置域名
- 损失函数、代价函数和目标函数的区别
- Mysql索引介绍及使用注意事项,limit分页查询,慢查询分析
- 个人免费可访问网页制作【GitHub】及其二维码制作(需要有网页源码)——论前端的浪漫
- Python 爬虫基础
- WIN10 启动后花屏
- python爬取大众点评_Python爬虫,获取大众点评上海地区的餐饮信息!