题意

输入一个正整数 \(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. 一篇文章讲清楚synchronized关键字的作用及原理

    概述 在应用Sychronized关键字时需要把握如下注意点: 一把锁只能同时被一个线程获取,没有获得锁的线程只能等待: 每个实例都对应有自己的一把锁(this),不同实例之间互不影响:例外:锁对象是 ...

  2. JVM 系列知识体系全面回顾

    经过几个月的努力,JVM 知识体系终于梳理完成了. 很早之前也和小伙伴们分享过 JVM 相关的技术知识,再次感谢大家支持和反馈. 最后再次献上 JVM系列文章合集索引,感兴趣的小伙伴可以点击查看. J ...

  3. 从url地址获取主机名

    function getHost(url) { var host = "null"; if(typeof url == "undefined"|| null = ...

  4. 在 Vue 实例中编写生命周期hook 或者其它 option/propertie 时,为什么不适用箭头函数 ?

    首先,箭头函数没有自己的 this 环境变量 会沿用作用域使用父级this : 由Vue 管理的函数 ,如果写成箭头函数 this 就不在是 Vue 实例 了 :

  5. 14. Vue2 和 Vue3 区别

    主要分为四点: 1. Vue3 使用了 proxy 替代了 Object.defineProperty 实现响应式数据 ,所以 vue3 的性能得到了提升 : 2. Vue3 可以在 template ...

  6. Android复习(四)权限—>概览

    权限概述 许可 的目的是保护Android用户的隐私.Android应用必须获得访问敏感用户数据(例如联系人和SMS)以及某些系统功能(例如相机和互联网)的权限.根据功能的不同,系统可能会自动授予权限 ...

  7. 我在大厂做 CR——如何体系化防控空指针异常

    大家好,我是木宛哥,今天和大家分享下--代码 CR 时针对恼人的空指针异常(NullPointerException)如何做到体系化去防控: 什么是空指针异常 从内存角度看,对象的实例化需要在堆内存中 ...

  8. 带你了解nginx功能

    关于Nginx 简介 功能 基本的HTTP服务器功能 其他HTTP服务器功能 邮件代理服务器功能 TCP / UDP代理服务器功能 架构和可扩展性 适用平台 简介 Nginx (engine x) 是 ...

  9. 用微软商店商店安装 Python

    在安装 Python 时,除了在官网 www.python.org 下载,还可以用微软商店下载 安装完成后,其目录位于C:\Users\<用户名>\AppData\Local\Micros ...

  10. 需求解决 _按需要对控件进行禁用和解除禁用 _CSS _20210922

    需求解决 _按需要对控件进行禁用和解除禁用 _CSS _20210922 通过JQuery 或者其他方式的选择器 获取DOM节点 再通过一下的方式 设置 disabled属性为 true 即可禁用,为 ...