CF229C 题解

思路

对于每个 u,v(1u,vn)u,v(1\le u,v\le n),它们之间一定有一条边,可能在原图上,也可能在另一个平面。然后如果要构成三角形,这三点 a,b,ca,b,c 必须互相连通,也相当于不能有 mpa,b+mpb,c+mpa,c3,0mp_{a,b}+mp_{b,c}+mp_{a,c}\ne3,0mpi,jmp_{i,j} 表示 iijj 在原图上是否有边相连)。这也就说明对于 a,b,ca,b,c 三个点,有两个点是有且仅有一条边与其余两个点相连,设 sis_i 表示有 sis_i 条边与 ii 点不相连,则 n1sin-1-s_i 条边与 ii 相连(因为原先是完全图,每个点有 n1n-1 条边),根据乘法原理,有 si×(n1si)s_i\times(n-1-s_i) 种方案,但因为会重复算两次,所以在加和后要把得数除以 22。然后完全图原先有 Cn3C_n^3 种选法,去除不合法的就是 Cn3i=1nsi×(n1si)C_n^3-\sum\limits_{i=1}^n s_i\times(n-1-s_i) 个三角形。

代码

# include <bits/stdc++.h>
typedef long long ll;
using namespace std;
int n, m, x, y, a[1000005];
ll sum;
int main () {
	ios::sync_with_stdio (0);
	cin.tie (0);
	cout.tie (0);
	cin >> n >> m;
	while (m --)
		cin >> x >> y, ++ a[x], ++ a[y];
	for (int i = 1; i <= n; ++ i)
		sum += a[i] * (n - 1 - a[i]);
	sum = n * (n - 1ll) * (n - 2) / 6 - sum / 2;
	cout << sum;
	return 0;
}
posted @   sz_jinzikai  阅读(13)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示