CF154C题解

news/2024/10/4 3:36:12

传送门:https://codeforces.com/problemset/problem/154/C

求出无向图中,满足所有出边都相连或出边直接连接点对的点对数。很显然可以暴力枚举点对一对对去check,时间复杂度\(O(n^2+m)\)

#include <bits/stdc++.h>using namespace std;inline int read() {char c;bool flag = false;while ((c = getchar()) < '0' || c > '9') if (c == '-') flag = true;int res = c - '0';while ((c = getchar()) >= '0' && c <= '9') res = (res << 3) + (res << 1) + c - '0';return flag ? -res : res;
}const int N = 2e5 + 1;int head[N], cnt, ans;
struct Edge {int v, next;
} e[N];void add(int u, int v) {e[cnt].v = v;e[cnt].next = head[u];head[u] = cnt++;
}map<pair<int, int>, int> mp;bool check(int x, int y) {for (int i = head[x]; ~i; i = e[i].next) {int to = e[i].v;if (to != y && !mp[make_pair(to, y)] && !mp[make_pair(y, to)]) return false;}for (int i = head[y]; ~i; i = e[i].next) {int to = e[i].v;if (to != x && !mp[make_pair(to, x)] && !mp[make_pair(x, to)]) return false;}return true;
}int main() {memset(head, -1, sizeof head);int n = read(), m = read();for (int i = 1; i <= m; ++i) {int u = read(), v = read();add(u, v);add(v, u);mp[make_pair(u, v)] = 1;}for (int i = 1; i <= n; ++i) for (int j = i + 1; j <= n; ++j) if (check(i, j)) ++ans;printf("%d", ans);return 0;
}

考虑优化,枚举点对肯定不可行,如何快速判定两点出边抵达的点相同?我们不妨把点集看作一个数,这样就能通过排序快速计算点集相同的点对,这里可以同行集合哈希来实现,分有边直连的点对和无边直连的点对两种情况计数即可。时间复杂度\(O(nlog_{2}n)\),瓶颈在于排序。

#include <bits/stdc++.h>typedef unsigned long long ull;
using namespace std;inline int read() {char c;bool flag = false;while ((c = getchar()) < '0' || c > '9') if (c == '-') flag = true;int res = c - '0';while ((c = getchar()) >= '0' && c <= '9') res = (res << 3) + (res << 1) + c - '0';return flag ? -res : res;
}const int N = 1e6 + 1;ull p[N], hs[N];int u[N], v[N];int main() {int n = read(), m = read();p[0] = 1;for (int i = 1; i <= n; ++i) p[i] = p[i - 1] * 13;for (int i = 1; i <= m; ++i) {u[i] = read(), v[i] = read();hs[u[i]] += p[v[i]];hs[v[i]] += p[u[i]];}long long ans = 0;for (int i = 1; i <= m; ++i) if (hs[u[i]] + p[u[i]] == hs[v[i]] + p[v[i]]) ++ans;sort(hs + 1, hs + n + 1);int cnt = 1;for (int i = 2; i <= n; ++i) {if (hs[i] == hs[i - 1]) ++cnt;else {ans += 1ll * cnt * (cnt - 1) / 2;cnt = 1;}}ans += 1ll * cnt * (cnt - 1) / 2;printf("%lld", ans);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/67555.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

SciTech-Mathmatics-Markdown:List 嵌入 code block + LaTex: 论文写作、排版与使用 + 数学公式的输入方式

民主与共和 更好的共和度保障更高级的民主, 是因为 民主 与 共和 是统一的。 平衡态的“跃迁”是需要“吸收足够能量”, "改变"总是需要"成本"的。 在正确的方向上,每一天的学习是“质变飞跃”的必要。Markdown: List 嵌入 code block Code is possible …

简单讲讲上下界网络流

无源汇可行流 无源汇网络流一般不讨论最大流,因为它的流都是环流,分布在各个位置,一是不好统计,二是一般也没有意义。所以一般建图只需要求是否有可行解(但我也没遇到过求输出YES和NO的可行流题目,网上的博客也都只当做有源汇的前置知识讲了) 废话不多说,直接上图。第一…

Netflix 錯誤 NW-8-18

环境 PS5的奈飞,OpenWrt的树莓派做软路由解决方案 首先重置,如果不行,关机拔掉电源线等待三分钟,重试 Netflix。如果这篇文章对你有用,可以关注本人微信公众号获取更多ヽ(^ω^)ノ ~

Python算法学习

算法学习心得,源码均为Python实现目录绪论数据结构算法算法的特征算法的评价算法的时间复杂度算法的空间复杂度递归汉诺塔问题(递归调用)查找排序二分查找检查排序是否完成冒泡排序选择排序插入排序希尔排序(高级版插入排序)快速排序堆排序(二叉树)python中内置好的堆排…

数学建模学习

数学建模学习,包含各种常用模型和Matlab源码目录 目录目录评价类方法层次分析法搜索引擎算法步骤算法代码F4锁定单元格优劣解距离法算法步骤算法代码自输入权重代码基于熵权法权重的代码灰色关联分析传统数理统计的不足之处该方法的好处算法步骤算法代码基于灰色关联度权重的代…

下载、安装、配置 android-studio-2021.1.1.22-windows

软件安装包:图1 软件安装包提示删除已经存在的版本:图2 提示删除已经存在的版本根据提示选择是:图3 根据提示选择是继续安装:图4图5图6图7图8图9图10

实景三维赋能城镇数字化规划

在数字化浪潮的推动下,城镇规划正经历着前所未有的变革。实景三维技术以其独特的优势,为城镇数字化规划提供了强大的技术支持。今天,我们将深入探讨实景三维技术如何赋能城镇数字化规划。一、城镇规划面临的挑战随着城镇化进程的加快,城镇规划面临着人口增长、资源分配、环…

土地规划中的公共设施布局:科学规划,赋能土地高效利用的艺术

在城市与区域发展的宏大叙事中,公共设施布局如同血管与神经网络,支撑着城市的脉动与感知。合理规划公共设施布局对于提升土地使用效率、促进社会公平、增强居民福祉至关重要。本文将深入探讨如何通过科学方法与创新策略,实现公共设施的高效布局,绘就城市发展的智慧蓝图。一…