[題目鏈接]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;
}