题目传送门

上来就想到既直接又简单的暴力方法,顺着每个房间的下一个走下去就好了,但是没想到最坏情况会达到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的更多相关文章

  1. 洛谷 P2921 在农场万圣节

    https://www.luogu.org/problemnew/show/P2921 开始感觉这题30行代码就可以搞定,还是太菜啦,还是乖乖地写了tarjan. 对图进行缩点,那么这个强联通分量中的 ...

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

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

  3. P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm(Tarjan+记忆化)

    P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm 题意翻译 题目描述 每年,在威斯康星州,奶牛们都会穿上衣服,收集农夫约翰在N(1<=N< ...

  4. 缩点【洛谷P2921】 [USACO08DEC]在农场万圣节Trick or Treat on the Farm

    [洛谷P2921] [USACO08DEC]在农场万圣节Trick or Treat on the Farm 题目描述 每年,在威斯康星州,奶牛们都会穿上衣服,收集农夫约翰在N(1<=N< ...

  5. 「USACO08DEC」「LuoguP2921」在农场万圣节Trick or Treat on the Farm(tarjan

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

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

    P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm 题意翻译 题目描述 每年,在威斯康星州,奶牛们都会穿上衣服,收集农夫约翰在N(1<=N< ...

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

    今天我来给大家带来一片蒟蒻题解 ~~真香 LGOJ P2921  [USACO08DEC]在农场万圣节Trick or Treat on the Farm 题目描述 每年,在威斯康星州,奶牛们都会穿上 ...

  8. C++ 洛谷 P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm 题解

    P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm 分析: 这棵树上有且仅有一个环 两种情况: 1.讨论一个点在环上,如果在则答案与它指向点相同, 2 ...

  9. 【洛谷P2921】[USACO08DEC]在农场万圣节

    在农场万圣节Trick or Treat on the Farm 题目链接 题解:首先,将原图缩点,变为DAG, 然后在DAG上记忆化搜索即可 #include<iostream> #in ...

随机推荐

  1. JVM(零):走入JVM

    JVM(零):走入JVM 本系列主要讲述JVM相关知识,作为本系列的第一篇文章,本文从Java为什么是一个跨平台的语音开始介绍,逐步引入Java虚拟机的概念,并给出一个JVM相关知识图谱,可以让读者从 ...

  2. ASCII流程图

    http://asciiflow.com/ http://www.torchsoft.com/en/aas_information.html

  3. httpclient失败重连机制

    HttpClient 底层会默认超时自动重发3次,DefaultHttpRequestRetryHandler源码 /**     * Create the request retry handler ...

  4. Python pandas学习笔记

    参考文献:<Python金融大数据分析> #导入模块 import pandas as pd #生成dataframe df = pd.DataFrame([10,20,30,40], c ...

  5. storm的例子,一个非常好的网址

    https://insight.io/github.com/apache/storm/tree/HEAD/examples/storm-elasticsearch-examples/src/main/ ...

  6. Linux 思维导图

    1.Linux学习路径: 2.Linux桌面介绍: 3.FHS(文件系统目录标准): 以上三张图,都是在学习实验楼上的课程--Linux 基础入门,教程里面看到的. 4.Linux需要特别注意的目录: ...

  7. Office WORD WPS如何设置PPT播放全屏

    1 在设计-页面设置中,幻灯片大小改成自定义,高度和宽度如下图所示.(我个人的笔记本是15.6存的宽屏笔记本,你可以根据自己笔记本的比例修改宽度和高度的数据来或者不同的比例值),注意在HDMI的输出方 ...

  8. win8系统 如何不显示这台电脑的文件夹

    在win8系统中,默认有下面这种文件夹   只要打开注册表编辑器,找到下面所示的项目,删除所有子文件夹即可(最后剩下一个DelegateFolders不用管) [HKEY_LOCAL_MACHINE\ ...

  9. 畅通project续

    Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submission(s) ...

  10. COCOS2DX学习之Box2d物理引擎使用之------动态物体的创建

    1.创建一个物理世界 首先要引入一个头文件#include "Box2D\Box2D.h" 之后利用b2word创建一个对象,而且指定这个物理世界中的加速度方向. word = n ...