[USACO08DEC]Trick or Treat on the Farm 记忆化搜索
这一题非常水,因为每个点的下一个目的地是唯一的,可以考虑对每一个还为访问过的点dfs直接找出所有的环,同时更新每一个点能去的点的数量(即答案)。
我们dfs时找到环上已经遍历过的一个点,用当前的dfn(即节点深度来算出环的大小,并在回溯时更新环上所有点的值(都是环的大小),知道回溯完整个环为止。如果一个点没有在环上,他的tot值应该等于他的目的地的tot值加一。
代码如下:
#include<iostream>
#include<cstdio>
#include<iomanip>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<stack>
#include<vector>
#include<map>
#include<set>
#define ll long long
#define db double
#define inf 0x7fffffff
using namespace std;
int to[100001];
int dfn[100001];
int tot[100001];
int n,t,f;
inline int qr(){
char ch;
while((ch=getchar())<'0'||ch>'9');
int res=ch^48;
while((ch=getchar())>='0'&&ch<='9')
res=(res<<1)+(res<<3)+(ch^48);
return res;
}
bool dfs(int i){
if(to[i]==i)tot[i]=1;return 0;//特判
if(tot[i])return 0;
if(dfn[i])return 1;
dfn[i]=++t;
if(dfs(to[i])){
if(f==dfn[i]){
tot[i]=tot[to[i]];
f=0;return 0;
}//回溯完整个环了,return的值应该变回0
if(!f){
tot[i]=dfn[i]-dfn[to[i]]+1;
f=dfn[to[i]];return 1;
}//算环的大小
tot[i]=tot[to[i]];
return 1;//目前还在环上遍历
}tot[i]=tot[to[i]]+1;
return 0;//没在环上
}
int main(){
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
n=qr();
for(int i=1;i<=n;++i)
to[i]=qr();
for(int i=1;i<=n;++i){
if(!tot[i])dfs(i);
printf("%d\n",tot[i]);
}
return 0;
}
[USACO08DEC]Trick or Treat on the Farm 记忆化搜索的更多相关文章
- P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm 记忆化搜索dfs
题目描述 每年,在威斯康星州,奶牛们都会穿上衣服,收集农夫约翰在N(1<=N<=100,000)个牛棚隔间中留下的糖果,以此来庆祝美国秋天的万圣节. 由于牛棚不太大,FJ通过指定奶牛必须遵 ...
- [P2921][USACO08DEC]在农场万圣节Trick or Treat on the Farm (记忆化搜索/DP?,Tarjan?)
第一看还以为是水题 随便打了一个bfs只有40分…… 然后开始颓废 #include<bits/stdc++.h> #define N 100005 using namespace std ...
- [USACO08DEC] Trick or Treat on the Farm
题目描述 每年万圣节,威斯康星的奶牛们都要打扮一番,出门在农场的N个牛棚里转 悠,来采集糖果.她们每走到一个未曾经过的牛棚,就会采集这个棚里的1颗糖果. 农场不大,所以约翰要想尽法子让奶牛们得到快乐. ...
- [USACO08DEC]Trick or Treat on the Farm (拓扑排序,DP)
题目描述 每年万圣节,威斯康星的奶牛们都要打扮一番,出门在农场的N个牛棚里转 悠,来采集糖果.她们每走到一个未曾经过的牛棚,就会采集这个棚里的1颗糖果. 农场不大,所以约翰要想尽法子让奶牛们得到快乐. ...
- 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< ...
- 洛谷——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 题目描述 每年,在威斯康星州,奶牛们都会穿上 ...
- 「USACO08DEC」「LuoguP2921」在农场万圣节Trick or Treat on the Farm(tarjan
题意翻译 题目描述 每年,在威斯康星州,奶牛们都会穿上衣服,收集农夫约翰在N(1<=N<=100,000)个牛棚隔间中留下的糖果,以此来庆祝美国秋天的万圣节. 由于牛棚不太大,FJ通过指定 ...
随机推荐
- win10系统安装web3js的正确方法
在安装web3的时候 用npm install web3 –save-dev 在win10系统下会一直安装不成功.后来换用了 cnpm install web3 –save-dev 安装时候报出:C ...
- Nmap命令
命令行:(显示扫描过程 -v ) 扫描单个主机 #nmap www.hostName.com 扫描整个ip段(子网) #nmap 192.168.1.1/24 //表示当前ip下的24位掩码主机都要扫 ...
- LeetCode 551. Student Attendance Record I (C++)
题目: You are given a string representing an attendance record for a student. The record only contains ...
- Test Cases
对于mode1 1 路径下一个空文件夹 结果:生成一个空的txt 2路径下一个文件夹内包含一个txt内容为abd(最基本的一个单词) 3路径下一个空文件夹一个txt,txt内容为以不同符号 ...
- BugPhobia准备篇章:Scrum Meeting工作分析篇
特别说明:此博客不计入正式开发过程的Scrum Meeting篇章,只是工作的基础分析 前端 王鹿鸣.钱林琛撰写初稿 能否前端完成一个页面后就能在本地跑起来进行测试? 能否在前端和后端完成对接后单页面 ...
- 《实时控制软件设计》之Automation Studio开发环境
Automation Studio是贝加莱公司的控制软件开发平台,软件可运行在贝加莱的基于PC的控制器上,基于Automation Studio我们可构建一个完整的控制软件构建.测试和仿真运行平台.本 ...
- RYU 灭龙战 first day
RYU 灭龙战 first day 前言 由于RYU翻译过来是龙的意思,此次主题就叫灭龙战吧 灵感来源 恶龙的三位真火-问题所在 参照了官方文档的基本操作 笔者以此执行 一个终端里 sudo mn - ...
- Vue 和 angular
vue适合移动端的项目,而angular更适合运用于Pc端的项目.
- npm 报错unable to verify the first certificate
npm总是报错:unable to verify the first certificate 原创 2017年09月30日 11:06:10 https://blog.csdn.net/nicexib ...
- 写出完整版的strcpy函数及其他如:strcat,strcmp,strstr的函数实现
(---牛客网中刷题---)写出完整版的strcpy函数 如果编写一个标准strcpy函数的总分值为10,下面给出几个不同得分的答案: 2分 1 2 3 4 void strcpy( char *st ...