Luogu P2921 在农场万圣节 【tarjan in 有向图】 By cellur925
上来就想到既直接又简单的暴力方法,顺着每个房间的下一个走下去就好了,但是没想到最坏情况会达到1e5,100000的数据铁定超时。
#include<cstdio>
#include<cstring>
#include<algorithm> using namespace std; int n;
int nex[],ans[];
bool vis[]; int dfs(int u)
{
int sum=,x=u;bool flag=;
memset(vis,,sizeof(vis));
vis[u]=;
while(flag)
{
int y=nex[x];
if(vis[y]) flag=;
vis[y]=;x=y;sum++;
}
sum--;
return sum;
} int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d",&nex[i]);
for(int i=;i<=n;i++)
ans[i]=dfs(i);
for(int i=;i<=n;i++)
printf("%d\n",ans[i]);
return ;
}
40 pts
正解:tarjan算法。
去到奶牛去过的隔间,显然这和环有关,我们手写一下样例(样例真香)就可以发现每个点只有两种情况:
1.在环中 这样的点答案为环的大小。
2.通过一些点才能与环相连 这样的点答案为环的大小+到达环的最小距离
于是我们就可以跑一遍tarjan,求出每个环的大小,对于那些不直接在环上的点,dfs一下即可。
Code
#include<cstdio>
#
include<algorithm>
#include<stack>
#define maxn 100090 using namespace std; int n,x,tot,dfs_clock,scc_cnt;
int head[maxn],dfn[maxn],scc[maxn],low[maxn],ans[maxn],size[maxn];
struct node{
int next,to;
}edge[maxn];
stack<int>s; void add(int x,int y)
{
edge[++tot].next=head[x];
edge[tot].to=y;
head[x]=tot;
} void tarjan(int u)
{
dfn[u]=low[u]=++dfs_clock;
s.push(u);
for(int i=head[u];i;i=edge[i].next)
{
int v=edge[i].to;
if(!dfn[v])
{
tarjan(v);
low[u]=min(low[v],low[u]);
}
else if(!scc[v]) low[u]=min(low[u],dfn[v]);
}
if(dfn[u]==low[u])
{
scc_cnt++;
while()
{
int p=s.top();
s.pop();
scc[p]=scc_cnt;
if(u==p) break;
}
}
} void dfs(int u,int fa,int step)
{
if(ans[fa])
{
ans[u]=ans[fa]+step;
return ;
}
else dfs(u,edge[head[fa]].to,step+);
} int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%d",&x);
add(i,x);
if(i==x) ans[i]=;
}
for(int i=;i<=n;i++)
if(!dfn[i]) tarjan(i);
for(int i=;i<=n;i++)
size[scc[i]]++;
for(int i=;i<=n;i++)
if(size[scc[i]]>) ans[i]=size[scc[i]];
for(int i=;i<=n;i++)
if(!ans[i]) dfs(i,edge[head[i]].to,);
for(int i=;i<=n;i++)
printf("%d\n",ans[i]);
return ;
}
然后就意想不到地RE了九个点(上述代码是AC的),查了大概两个小时(?),还一直以为是tarjan的锅,结果发现是Dfs的时候“else dfs(x,nxt[fa],step+1);”这句话,第二个参量应该是nxt[fa],我写成了nxt[x],这不就死循环了嘛。xswl。
自己还是太菜了。(哭)
Luogu P2921 在农场万圣节 【tarjan in 有向图】 By cellur925的更多相关文章
- 洛谷 P2921 在农场万圣节
https://www.luogu.org/problemnew/show/P2921 开始感觉这题30行代码就可以搞定,还是太菜啦,还是乖乖地写了tarjan. 对图进行缩点,那么这个强联通分量中的 ...
- 洛谷 P2921 在农场万圣节Trick or Treat on the Farm题解
题意翻译 题目描述 每年,在威斯康星州,奶牛们都会穿上衣服,收集农夫约翰在N(1<=N<=100,000)个牛棚隔间中留下的糖果,以此来庆祝美国秋天的万圣节. 由于牛棚不太大,FJ通过指定 ...
- P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm(Tarjan+记忆化)
P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm 题意翻译 题目描述 每年,在威斯康星州,奶牛们都会穿上衣服,收集农夫约翰在N(1<=N< ...
- 缩点【洛谷P2921】 [USACO08DEC]在农场万圣节Trick or Treat on the Farm
[洛谷P2921] [USACO08DEC]在农场万圣节Trick or Treat on the Farm 题目描述 每年,在威斯康星州,奶牛们都会穿上衣服,收集农夫约翰在N(1<=N< ...
- 「USACO08DEC」「LuoguP2921」在农场万圣节Trick or Treat on the Farm(tarjan
题意翻译 题目描述 每年,在威斯康星州,奶牛们都会穿上衣服,收集农夫约翰在N(1<=N<=100,000)个牛棚隔间中留下的糖果,以此来庆祝美国秋天的万圣节. 由于牛棚不太大,FJ通过指定 ...
- 洛谷——P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm
P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm 题意翻译 题目描述 每年,在威斯康星州,奶牛们都会穿上衣服,收集农夫约翰在N(1<=N< ...
- LGOJ P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm
今天我来给大家带来一片蒟蒻题解 ~~真香 LGOJ P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm 题目描述 每年,在威斯康星州,奶牛们都会穿上 ...
- C++ 洛谷 P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm 题解
P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm 分析: 这棵树上有且仅有一个环 两种情况: 1.讨论一个点在环上,如果在则答案与它指向点相同, 2 ...
- 【洛谷P2921】[USACO08DEC]在农场万圣节
在农场万圣节Trick or Treat on the Farm 题目链接 题解:首先,将原图缩点,变为DAG, 然后在DAG上记忆化搜索即可 #include<iostream> #in ...
随机推荐
- [Bzoj2120]数颜色 (非正解 )(莫队)
2120: 数颜色 Time Limit: 6 Sec Memory Limit: 259 MBSubmit: 6286 Solved: 2489[Submit][Status][Discuss] ...
- Wannafly挑战赛1
地址:https://www.nowcoder.com/acm/contest/15#question A(树形dp) 分析 dp[i][0],dp[i][1]分别表示以i为根的子树中,有多少个点到i ...
- Android开发之自己定义Spinner样式的效果实现(源码实现)
android系统自带的Spinner样式是远远满足不了我们实际开发过程中对Spinner UI风格的要求,因此我们肯定须要为了切合整个应用的风格,改动我们的Spinner样式.系统给我们提供了两种常 ...
- C语言细节笔记1
/******************************************************************************* ——笔记 1. 函数申明的书写. 可以 ...
- 关于Android中物理按键不响应的可能的一个问题。
今天在工作中犯了一个错误,写的视频播放器突然物理音量键就不起作用了. 一開始以为是自己定义的音量条把系统的物理音量条按键给屏蔽掉了. 删除自己定义的音量条还是不行,又怀疑是是加入了什么权限之类的.重复 ...
- linux中用anaconda使用不同版本python
1.使用命令conda create --name python36 python=3.6 #你想使用哪个版本就下载哪个版本,--name后面跟的是该虚拟环境的名称 2.需要使用python3.6时 ...
- Webapp兼容性布局
- 跨域,Content-Type组件
1,跨域:是浏览器的同源策略 阻止ajax请求不组织src请求 2,一个源的定义:如果两个页面的协议,端口(如果由指定)和域名都相同,则两个页面具有相同的源 下面给出相对http://a.xyz.co ...
- Node.js 101(2): Promise and async
--原文地址:http://blog.chrisyip.im/nodejs-101-package-promise-and-async 先回想一下 Sagase 的项目结构: lib/ cli.js ...
- XMU C语言程序设计实践(1)
题目: 任务1:英雄出世 炎热的夏天午后,小明正在百无聊赖地写c语言程序.忽然,电脑屏幕一阵抖动,浮现下面18×18个看似杂乱无章的数字: 32, 32, 32, 32, 32, 32, ...