题意

输入一个正整数 \(T(1 \leq T \leq 10^4)\),表示接下来输入 \(T\) 组测试用例,对于每一个测试用例:

第一行,输入一个正整数 \(n(2 \leq n \leq 2 * 10^5)\)

第二行,输入 \(n\) 个正整数 \(a_i(1 \leq a_i \leq n)\),表示节点 \(i\) 到节点 \(a_i\) 存在一条有向边,保证无自环

这 \(n\) 个节点共同围成若干个环,特殊情况除只有两个节点的环以外,每个节点左右各有一个相邻节点。且每个环至少会有 \(2\) 个节点。

问这 \(n\) 个节点最少和最多各能组成多少个环?

题解

建立有向边后,必定可以划分为若干张(弱)连通图,连通图若整张图就是个环且节点数大于 \(2\),则无法再插入更多元素,其他情况均可以与节点数大于等于3的环以外的(弱)连通图进行结合。

总结为:大二有环即为环,否则均为一条链

参考代码

#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
using namespace std; constexpr int N = 2e5 + 7;
int T = 1, n;
int a[N], in[N], dsu[N], sz[N];
bool vis[N]; int find(int x) { return x == dsu[x] ? x : dsu[x] = find(dsu[x]); } void merge(int x, int y) {
int fx = find(x), fy = find(y);
if (fx == fy) return ;
dsu[fx] = fy;
sz[fy] += sz[fx];
} void solve() {
int cnt1 = 0, cnt2 = 0;
cin >> n;
for (int i = 1; i <= n; ++ i) {
cin >> a[i];
dsu[i] = i;
sz[i] = 1;
in[i] = 0;
vis[i] = false;
}
auto dfs = [&](auto &&dfs, int x) -> void {
vis[x] = true;
in[a[x]] ++;
merge(x, a[x]);
if (!vis[a[x]]) dfs(dfs, a[x]);
};
unordered_map<int, bool> ump;
for (int i = 1; i <= n; ++ i) if (!vis[i]) dfs(dfs, i);
for (int i = 1; i <= n; ++ i) {
bool b = in[i] == 2;
int ro = find(i);
if (ump.find(ro) == ump.end()) ump[ro] = b;
else ump[ro] = b || ump[ro];
}
for (auto &it: ump) (it.second || sz[it.first] < 3 ? cnt1 : cnt2) ++;
cout << cnt2 + (cnt1 > 0) << ' ' << cnt1 + cnt2 << '\n';
} int main() {
IOS
cin >> T;
while (T --) solve();
return 0;
}

【并查集+dfs】codeforces 1833 E. Round Dance的更多相关文章

  1. Codeforces 455C Civilization(并查集+dfs)

    题目链接:Codeforces 455C Civilization 题目大意:给定N.M和Q,N表示有N个城市,M条已经修好的路,修好的路是不能改变的.然后是Q次操作.操作分为两种.一种是查询城市x所 ...

  2. [并查集+逆向思维]Codeforces Round 722C Destroying Array

    Destroying Array time limit per test 1 second memory limit per test 256 megabytes input standard inp ...

  3. 【搜索】【并查集】Codeforces 691D Swaps in Permutation

    题目链接: http://codeforces.com/problemset/problem/691/D 题目大意: 给一个1到N的排列,M个操作(1<=N,M<=106),每个操作可以交 ...

  4. 牛客练习赛16 C 任意点【并查集/DFS/建图模型】

    链接:https://www.nowcoder.com/acm/contest/84/C 来源:牛客网 题目描述 平面上有若干个点,从每个点出发,你可以往东南西北任意方向走,直到碰到另一个点,然后才可 ...

  5. HDU 1232 并查集/dfs

    原题: http://acm.hdu.edu.cn/showproblem.php?pid=1232 我的第一道并查集题目,刚刚学会,我是照着<啊哈算法>这本书学会的,感觉非常通俗易懂,另 ...

  6. 1021.Deepest Root (并查集+DFS树的深度)

    A graph which is connected and acyclic can be considered a tree. The height of the tree depends on t ...

  7. POJ1291-并查集/dfs

    并查集 题意:找出给定的这些话中是否有冲突.若没有则最多有多少句是对的. /* 思路:如果第x句说y是对的,则x,y必定是一起的,x+n,y+n是一起的:反之x,y+n//y,x+n是一起的. 利用并 ...

  8. 线段树 或者 并查集 Intel Code Challenge Elimination Round (Div.1 + Div.2, combined) C

    http://codeforces.com/contest/722/problem/C 题目大意:给你一个串,每次删除串中的一个pos,问剩下的串中,连续的最大和是多少. 思路一:正方向考虑问题,那么 ...

  9. F2 - Spanning Tree with One Fixed Degree - 并查集+DFS

    这道题还是非常有意思的,题意很简单,就是给定一个图,和图上的双向边,要求1号节点的度(连接边的条数)等于K,求这棵树的生成树. 我们首先要解决,如何让1号节点的度时为k的呢???而且求的是生成树,意思 ...

  10. UVA208-Firetruck(并查集+dfs)

    Problem UVA208-Firetruck Accept:1733  Submit:14538 Time Limit: 3000 mSec  Problem Description The Ce ...

随机推荐

  1. 利用AutoGpt将任何模型支持o1模型的推理实现

    利用AutoGpt将任何模型支持o1模型的推理实现 相信大家都对于OpenAI最新出的o1模型都非常关注,它已经能通过推理让回复的效果更加理想, 但是目前o1的限制太大,而且使用o1至少也是需要购买O ...

  2. Hugging Face 论文平台 Daily Papers 功能全解析

    文/ Adeena, 在快速发展的研究领域,保持对最新进展的关注至关重要.为了帮助开发者和研究人员跟踪 AI 领域的前沿动态,Hugging Face 推出了 Daily Papers 页面.自发布以 ...

  3. Windows 缺失Qt5.xxxx.dll,无法继续执行代码

    事件起因: 客户自行安装完Autodesk系软件后, 软件一直弹窗报错 AutodDesktopApp.exe - 系统错误 Windows软件报错:由于找不到Qt5.xxxx.dll,无法继续执行代 ...

  4. Linux内核源码阅读:AArch64的异常处理机制详谈(内核版本6.11)

    ​ 任何玩过Arm64架构的朋友都知道,我们的ARM64架构有异常:Exception Levels, ELs,它是其异常处理机制的核心组成部分,允许系统在不同的特权级别下执行代码.ARM64定义了四 ...

  5. 简单 webapi 登录成功就返回 电脑的进程信息·

    /// <summary> /// 如果登录成功就返回电脑的进程信息 /// </summary> /// <returns></returns> [H ...

  6. js递归遍历树形结构数据,获取所有数组id集合

    function getAllIds(tree, result) { //遍历树 获取id数组 for (const i in tree) { result.push(tree[i].id); // ...

  7. kotlin协程——>异常处理

    异常处理 本节内容涵盖了异常处理与在异常上取消.我们已经知道取消协程会在挂起点抛出 CancellationException 并且它会被协程的机制所忽略.在这⾥我们会看看在取消过程中抛出异常或同 ⼀ ...

  8. Android复习(五)设备兼容—>多apk支持

    1. 对于不同的屏幕发布单独的apk https://developer.android.google.cn/training/multiple-apks/screensize 2.多窗口模式 在An ...

  9. day18-方法

    何谓方法? System.out.println() System->类 out->对象 println()->方法 Java方法是语句的集合,它们在一起执行 一个功能. 方法是解决 ...

  10. RocketMQ 全链路灰度探索与实践

    本文作者:肖京,Spring Cloud Alibaba PMC,阿里云智能技术专家. 01 全链路灰度背景介绍 发布新版本时,为了有效.谨慎地验证新版本代码逻辑的正确性,通常会采用灰度发布,从而达到 ...