VK Cup 2017 - Round 1 A - Bear and Friendship Condition(并查集维护大小 + dfs 遍历图统计边数)

这篇具有很好参考价值的文章主要介绍了VK Cup 2017 - Round 1 A - Bear and Friendship Condition(并查集维护大小 + dfs 遍历图统计边数)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

VK Cup 2017 - Round 1 A - Bear and Friendship Condition(并查集维护大小 + dfs 遍历图统计边数)
VK Cup 2017 - Round 1 A - Bear and Friendship Condition(并查集维护大小 + dfs 遍历图统计边数)
VK Cup 2017 - Round 1 A - Bear and Friendship Condition(并查集维护大小 + dfs 遍历图统计边数)

题目大意:

给你一些n个点m条边,如果三个点(a,b,c)是合法的,当且仅当 a-b,b-c,c-a都有一条边,问你这个图是否合法,如果有一个或两个点视为合法

思路

考虑什么图才是个合法图:除了点数小于 3 的图一定合法外,必须是完全图才合法,假设完全图有 n 个点,则它的边数为:(n - 1) * n / 2。

用并查集分割为若干个集合,dfs 遍历每个集合,判断每个大小大于2的图是否是完全图即可。

这里积累个小技巧,用set存图,每次操作 logn,方便统计图的边数,具体看代码。文章来源地址https://www.toymoban.com/news/detail-434115.html

时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn)

代码:

#include<bits/stdc++.h>

using namespace std;
#define int long long
const int N = 1.5e5 + 10;
int n, m;
int p[N], siz[N];
set<int> g[N];
int edge = 0;
bool vis[N];

int Find(int x) {
	if (p[x] != x) {
		p[x] = Find(p[x]);
	}
	return p[x];
}

void dfs(int u)
{
	vis[u] = true;
	edge += g[u].size();
	for (auto son : g[u]) {
		g[son].erase(u);
	}
	for (auto son : g[u]) {
		if (vis[son]) continue;
		dfs(son);
	}
}

signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr), cout.tie(nullptr);
	cin >> n >> m;
	for (int i = 1; i <= n; ++i) {
		p[i] = i;
		siz[i] = 1;
	}
	for (int i = 0; i < m; ++i) {
		int a, b; cin >> a >> b;
		g[a].insert(b);
		g[b].insert(a);
		int pa = Find(a), pb = Find(b);
		if (pa != pb) {
			siz[pb] += siz[pa];
			p[pa] = pb;
		}
	}
	for (int i = 1; i <= n; ++i) {
		p[i] = Find(i);
	}
	for (int i = 1; i <= n; ++i) {
		if (p[i] != i || siz[i] <= 2) continue;
		edge = 0;
		dfs(i);
		if (edge != siz[i] * (siz[i] - 1) / 2) {
			cout << "NO" << '\n';
			return 0;
		}
	}

	cout << "YES" << '\n';

	return 0;
}

到了这里,关于VK Cup 2017 - Round 1 A - Bear and Friendship Condition(并查集维护大小 + dfs 遍历图统计边数)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据结构】并查集

    并查集是简单的数据结构,学会并查集,为图打好基础。 是树状的数据结构,用于处理相交集合的合并与查询 通常用森林表示,一片森林表示一个集合 并查集一般需要完成 查找元素属于哪个集合 查看两个元素是否属于同一个集合 将两个集合归并成一个集合 集合的个数 假

    2024年02月19日
    浏览(37)
  • 【数据结构】--并查集

    目录 一、概念 ​编辑 二、应用场景--“连接”问题(属于同一Qu 三、实现思路  四、如何存储数据 五、定义接口 1.初始化(init) 2.其他 isSame() 六、抽象类 六、Quick Find【v1 所在集合的所有元素都指向 v2 的根节点】 1.Union 1.Union图解 2.注意点:  3.代码实现 2.find  1.find图

    2023年04月09日
    浏览(34)
  • 【高阶数据结构】——并查集

    在一些应用问题中, 需要将n个不同的元素划分成一些不相交的集合。开始时,每个元素自成一个单元素集合, 然后按一定的规律将归于同一组元素的集合合并 。在此过程中要 反复用到查询某一个元素归属于那个集合的运算 。适合于描述这类问题的抽象数据类型称为 并查集

    2024年02月16日
    浏览(38)
  • 【模板】并查集

    并查集是解决两元素是否属于同一集合,将一个集合合并另一集合的数据结构。具体来说,我们使用数字代替集合,比如集合1,集合2.使用数组f[i]维护元素i属于的集合,比如f[2] = 4表示元素2属于集合4。具体我们有以下实现功能的代码 1 初始化表示集合的数组。     表示元素

    2024年01月25日
    浏览(35)
  • 并查集の进阶用法

    我们在处理问题的时候,可能会遇到一些需要维护每个元素所在的集合的问题,而并查集却恰好完美解决了这个问题。 对于普通的并查集,他支持的操作比较少,只有合并和查询,合并是指把两个集合合并成一个,而查询是询问两个元素是否在同一集合内;对于这两种操作,

    2024年02月02日
    浏览(42)
  • 数据结构---并查集

    这里可以使用生活中的一个例子来带着大家理解并查集,大家在上学的过程中肯定会发现一种现象,在开学之前大家谁也不认识谁每个人都是一个小团体,可是开学之后因为座位旁边有一个同桌,所以开学没多久你和同桌就会互相认识并且开心的玩在一起,那么这时就是两个

    2024年02月15日
    浏览(43)
  • 力扣--并查集547.省份数量

    思路分析: 首先定义变量 fa 用于记录并查集,以及城市数量 n 。 定义了并查集的两个函数, find 用于查找节点的根节点, togother 用于合并两个节点所在的集合。 在公共函数 findCircleNum 中,初始化并查集,然后遍历 isConnected 数组,将相连的城市进行合并。 最后使用 visited

    2024年03月26日
    浏览(35)
  • 高阶数据结构 ——— 并查集

    并查集是一种树型的数据结构,用于处理一些不相交集合的合并及查询问题。 并查集通常用森林来表示,森林中的每棵树表示一个集合,树中的结点对应一个元素。 说明一下: 虽然利用其他数据结构也能完成不相交集合的合并及查询,但在数据量极大的情况下,其耗费的时

    2024年02月03日
    浏览(54)
  • 并查集算法实现

    牛客测试链接 并查集(Disjoint Set)是一种用于处理集合合并与查询问题的数据结构。它支持两种操作:合并(Union)和查询(Find)。 合并操作将两个不相交的集合合并为一个集合,查询操作用于判断两个元素是否属于同一个集合。 本文将介绍并查集算法的实现,并给出一个

    2024年01月25日
    浏览(41)
  • 并查集

    并查集 并查集是用来判断两个元素是否属于同一个集合 即判断他们的根节点是否相同 1. 初始化 2.查询根节点 3.合并 集合变为一个长长的链时,查找变得十分麻烦,此时我们需要路径压缩 即每个人的直接根节点就是最上面的根节点 我们判断两个元素是否是同一个集合,看的

    2024年02月08日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包