[题目链接]http://codeforces.com/problemset/problem/229/C
[trans]
给定n个节点的完全图,从中选出m条边构成图A,剩余边构成图B,询问图a和图b中的三角形个数
[sol]
完全图中的三角形个数为C(n,3),这些三角形一部分被破坏掉,其余的则形成了图A和图B的三角形,问题等价
于询问破坏掉多少三角形,我们把选出的边成为蓝边,没选的边称为白边,那么破坏的三角形是由蓝边和白
边共同组成的,即计算有蓝边和白边组成的三角形个数。
计算三角形个数可以从两个角度出发,边和点。对于边,损坏的三角形由蓝蓝白或蓝白白组成,提供的特征
没什么明朗的思路,对于点来说,每个损坏三角形由两个点连接的一条蓝边和一条白边,另外一点连接的相
同颜色的边,那么加入一点有k个蓝边,那么一定有(n - 1 -k)条白边,这样就可以形成k * (n-1-k)个损坏
三角形,不必在意第三条边的颜色,ans算了2遍,所以损坏三角形的个数∑ki*(n-1-ki)
#include<cstdio>
#include<iostream>
#include<cstring>
typedef long long ll;
using namespace std;
int f[1000000 + 5];
int main()
{
int n, m;
scanf("%d%d", &n, &m);
for (int i = 0; i < m; i++)
{
int x, y;
scanf("%d%d", &x, &y);
f[x] ++;
f[y]++;
}
ll ans = 0;
for(int i = 1; i <= n; i++)
ans += 1LL* f[i] * (n - 1 -f[i]);
ans /= 2;
ans = 1LL * n * (n - 1) * (n - 2) / 6 - ans;
cout<<ans;
return 0;
}