#洛谷 2921 记忆化搜索 tarjan


传送门 (https://www.luogu.org/problem/show?pid=2921)


做这题的经历有点玄学,,起因是某个random题的同学突然发现了一个0提交0通过的题目,然后就引发了整个机房的兴趣,,然后,,就变成了16提交7通过,,

初看上去这题目就是记忆化搜索,但是环的存在使得普通的记忆化会导致漏解,继续观察发现整张图为n个点n条边,即是多个基环外向树,使用tarjan找到图中的环,显然可知,对于环上一点,能取到的最大值是环的长度,对于环外一点,能取到的最大值是它走到环的长度加上环长,之后采用记忆化搜索或dp即可得解

Warning:

  1. 从样例可以显然发现,存在自环
  2. 开始写tarjan时错误的理解了low数组的含义,将其与from数组混淆

#include <cstdio>
#include <cstring>
#include <algorithm> const int maxn = 100000 + 100;
int next[maxn];
int dfn[maxn], low[maxn], size[maxn], sta[maxn];
int from[maxn];
int vis[maxn];
int stackTop = 0;
int tim = 0;
int n;
int ans[maxn]; void tarjan(int x) {
tim++;
stackTop++;
sta[stackTop] = x;
dfn[x] = low[x] = tim;
vis[x] = 1;
if (!dfn[next[x]]) {
tarjan(next[x]);
low[x] = std :: min(low[next[x]], low[x]);
} else if (vis[next[x]]) {
low[x] = std :: min(low[x], dfn[next[x]]);
}
if (low[x] == dfn[x]) {
while (sta[stackTop] != x) {
size[x]++;
from[sta[stackTop]] = x;
vis[sta[stackTop]] = 0;
stackTop--;
}
vis[x] = 0;
stackTop--;
size[x]++;
from[x] = x;
}
} void dfs(int x) {
if (ans[x] > 0) return;
if (from[x] != x || size[x] > 1) {
ans[x] = size[from[x]];
return;
} else if (next[x] == x) {
ans[x] = 1;
return;
} else {
dfs(next[x]);
ans[x] = 1 + ans[next[x]];
}
} int main () {
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%d", &next[i]);
}
for (int i = 1; i <= n; i++) {
if (!dfn[i]) tarjan(i);
}
//for (int i = 1; i <= n; i++)
// printf("%d\n", from[i]);
for (int i = 1; i <= n; i++)
if (ans[i] == 0) dfs(i);
for (int i = 1; i <= n; i++) printf("%d\n", ans[i]);
return 0;
}

洛谷 2921 记忆化搜索 tarjan 基环外向树的更多相关文章

  1. 【题解】洛谷P3953 [NOIP2017TG] 逛公园(记忆化搜索+SPFA)

    题目来源:洛谷P3953 思路 先用SPFA求一遍最短路 在求最短路的同时可以把所有点到终点的最短路求出来 dis数组 注意要反向SPFA  因为从起点开始可能会走到一些奇怪的路上导致时间负责度增加 ...

  2. 洛谷P1434滑雪题解及记忆化搜索的基本步骤

    题目 滑雪是一道dp及记忆化搜索的经典题目. 所谓记忆化搜索便是在搜索的过程中边记录边搜索的一个算法. 当下次搜到这里时,便直接使用. 而且记忆化搜索一定要满足无后效性,为什么呢,因为如果不满足无后效 ...

  3. 洛谷 p1434 滑雪【记忆化搜索】

    <题目链接> Michael喜欢滑雪.这并不奇怪,因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道 ...

  4. 洛谷 P1464 Function【记忆化搜索】

    题目链接 题目描述 对于一个递归函数w(a,b,c) 如果a<=0 or b<=0 or c<=0就返回值1. 如果a>20 or b>20 or c>20就返回w ...

  5. 洛谷P1192 台阶问题【记忆化搜索】

    题目:https://www.luogu.org/problemnew/show/P1192 题意: 给定n和k,一个人一次可以迈1~k步,问走n步有多少种方案. 思路: 本来傻乎乎上来就递归,显然会 ...

  6. 洛谷P1040 加分二叉树【记忆化搜索】

    题目链接:https://www.luogu.org/problemnew/show/P1040 题意: 某一个二叉树的中序遍历是1~n,每个节点有一个分数(正整数). 二叉树的分数是左子树分数乘右子 ...

  7. 【洛谷】3953:逛公园【反向最短路】【记忆化搜索(DP)统计方案】

    P3953 逛公园 题目描述 策策同学特别喜欢逛公园.公园可以看成一张N个点M条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口,N号点是公园的出口,每条边有一个非负权值, 代表策策经过这条 ...

  8. 洛谷P2657 [SCOI2009]windy数 [数位DP,记忆化搜索]

    题目传送门 windy数 题目描述 windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道, 在A和B之间,包括A和B,总共有多少个win ...

  9. 洛谷P1057 传球游戏(记忆化搜索)

    点我进入题目 题目大意:n个小孩围一圈传球,每个人可以给左边的人或右边的人传球,1号小孩开始,一共传m次,请问有多少种可能的路径使球回到1号小孩. 输入输出:输入n,m,输出路径的数量. 数据范围:4 ...

随机推荐

  1. 获取DATA的数据

    num=DataTable("参数名",dtGlobalSheet) 'systemutil.Run "C:\Program Files (x86)\HP\QuickTe ...

  2. CF786A - Berzerk

    /* CF786A - Berzerk http://codeforces.com/contest/786/problem/A 博弈论 直接搜出NP状态图.记得要记忆化剪枝. * */ #includ ...

  3. poj 2955 区间dp入门题

    第一道自己做出来的区间dp题,兴奋ing,虽然说这题并不难. 从后向前考虑: 状态转移方程:dp[i][j]=dp[i+1][j](i<=j<len); dp[i][j]=Max(dp[i ...

  4. ie固定table单元格宽度

    <table border="0" style="width:690px; table-layout:fixed;"> <tr> < ...

  5. [Angular] Service Worker Version Management

    If our PWA application has a new version including some fixes and new features. By default, when you ...

  6. 【iOS开发-78】用代码实现UITabBarController+UINavigationController

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2Vpc3ViYW8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA ...

  7. 学习笔记一:关于directx sdk的安装于一些概念

    关于directx sdk开发环境的安装: 在百度搜索了directx sdk,进入了微软的官网,下载了DXSDK_Jun10.exe 百度网盘:http://pan.baidu.com/s/1o6r ...

  8. MongoDB 2.6安装

    Workaround to install as a service You can manually install 2.6.0 as a service on Windows from an Ad ...

  9. zzulioj--1858--单词翻转(模拟)

    1858: 单词翻转 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 88  Solved: 35 SubmitStatusWeb Board Desc ...

  10. Java底层四个核心技术

    今天早起失败,加上忙碌的一天加班工作,没按计划总结Java相关的技术,刚看到下面的文章总结的不错,转载一下. Java有哪四个核心技术?首先,我们要了解一下java核心技术的重要性,它可以帮助我们举一 ...