【题解】P2921 在农场万圣节(tarjan)
这个题可以用tarjan解决,将染色后的点标记为tarjan的那个点,特判如果出发点等于目标点 答案就是1,如果要求的那个点在强连通分量里面,我们就输出其所含的cnt(也就是强连通分量所代表的环的大小)。如果目标点不在强连通分量里,我们就从该点进行扩展,记录下扩展的步数step。如果扩展到一个强连通分量内,答案就是step+该强连通分量的环的大小,break掉即可。最后输出每一个点的答案。
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn=100010;
int n;
int head[maxn],nnext[maxn*2],to[maxn*2];
int tot,top,index,ink;
int dfn[maxn],low[maxn],cnt[maxn],stack[maxn],ans[maxn],color[maxn];
bool b[maxn],instack[maxn];
void add(int x,int y)
{tot++;nnext[tot]=head[x];head[x]=tot;to[tot]=y;
}
void tarjan(int x)
{dfn[x]=low[x]=++index;stack[++top]=x;b[x]=true;instack[x]=true;for(int i=head[x];i;i=nnext[i]){int y=to[i];if(!b[y]){tarjan(y);low[x]=min(low[x],low[y]);}else if(instack[y]){low[x]=min(low[x],low[y]);}}if(dfn[x]==low[x]){int k;do{k=stack[top];instack[k]=false;color[k]=x;top--;}while(stack[top+1]!=x);}
}int main()
{scanf("%d",&n);for(int i=1;i<=n;i++){int tmp;cin>>tmp;add(i,tmp);if(tmp==i) ans[i]=1;}for(int i=1;i<=n;i++){if(!b[i]) {tarjan(i);}}for(int i=1;i<=n;i++){cnt[color[i]]++;}for(int i=1;i<=n;i++){if(cnt[color[i]]!=1){ans[i]=cnt[color[i]];}} for(int i=1;i<=n;i++){if(ans[i]==0){int step=1;int x=i;while(1){for(int j=head[x];j;j=nnext[j]){x=to[j];}if(ans[x]!=0){ans[i]=step+ans[x];break;}else step++;}}}for(int i=1;i<=n;i++){cout<<ans[i]<<endl;}return 0;
}
【题解】P2921 在农场万圣节(tarjan)相关推荐
- 洛谷 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通过指定 ...
- 洛谷[P2921]在农场万圣节
题目传送门OvO 题目描述 每年,在威斯康星州,奶牛们都会穿上衣服,收集农夫约翰在N(1<=N<=100000)N(1<=N<=100000)N(1<=N<=100 ...
- P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm(有环图的搜索)
P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm 题目描述 Every year in Wisconsin the cows celebrate t ...
- 洛谷 P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm
题目描述 每年,在威斯康星州,奶牛们都会穿上衣服,收集农夫约翰在N(1<=N<=100,000)个牛棚隔间中留下的糖果,以此来庆祝美国秋天的万圣节. 由于牛棚不太大,FJ通过指定奶牛必须遵 ...
- P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm
对于一个牛,它存在两种状态:1.处于联通分量 2.不处于联通分量.对于处于联通分量的牛,求出联通分量的大小:对于不处于联通分量的牛,求出其距离联通分量的路程+联通分量大小. 不同的联通分量,染上不同的 ...
- [USACO08DEC]在农场万圣节Trick or Treat on the Farm
https://www.luogu.org/problemnew/show/P2921 C++版本一 朴素 一.为了实现这一方法,我们对每个点设置两个属性: 1.颜色 (color)(color) : ...
- [USACO08DEC]在农场万圣节Trick or Treat on the Farm【Tarja缩点+dfs】
题目描述 每年,在威斯康星州,奶牛们都会穿上衣服,收集农夫约翰在N(1<=N<=100,000)个牛棚隔间中留下的糖果,以此来庆祝美国秋天的万圣节. 由于牛棚不太大,FJ通过指定奶牛必须遵 ...
- Luogu 2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm
基环树森林,然而我比较菜,直接tarjan找环. 发现缩点之后变成了DAG,每一个点往下走一定会走到一个环,缩点之后搜一遍看看会走到哪个环以及那个环的编号是多少,答案就是环的$siz$$ + $要走的 ...
最新文章
- ios开发之UIView的frame、bounds跟center属性的区别(附图)
- java.util.Date和java.sql.Date
- 别再无聊地吹捧了,一起来动手实现MAE玩玩吧!
- csdn中使用Git的一些注意问题
- pickle库的使用详解
- linux设置ntp开机同步时间同步,linux ntp时间同步
- 禁止VirtualBox同步Guest系统的时间
- 跟踪slab分配堆栈流程的方法(perf、systemtap)
- PHP-阿里云oss使用
- uboot中bss的理解
- 【算法】阿里双十一推荐技术
- 使用GCC和Makefile编译c文件
- 征途对计算机配置要求,征途2配置要求是什么?
- 环保性能高的家装乳胶漆怎么选择
- 追风逐日,Wi-SUN助推新能源数字化
- java检查html是否闭合,Java Html解析器和闭合标记
- java基础之final关键字_繁星漫天_新浪博客
- 远程桌面连接管理器RDCMan教程
- 计算机编程语言排行榜—TIOBE世界编程语言排行榜(2020年11月份最新版)
- php rot13解密,php对字符串执行ROT13编码的函数str_rot13()