CF229C 题解
思路
对于每个 ,它们之间一定有一条边,可能在原图上,也可能在另一个平面。然后如果要构成三角形,这三点 必须互相连通,也相当于不能有 ( 表示 和 在原图上是否有边相连)。这也就说明对于 三个点,有两个点是有且仅有一条边与其余两个点相连,设 表示有 条边与 点不相连,则 条边与 相连(因为原先是完全图,每个点有 条边),根据乘法原理,有 种方案,但因为会重复算两次,所以在加和后要把得数除以 。然后完全图原先有 种选法,去除不合法的就是 个三角形。
代码
# 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;
}

浙公网安备 33010602011771号