Codeforces 229C (142C) Triangles

問題

n頂点m辺からなる無向グラフが与えられる。


n頂点からなる完全グラフのうち、m辺をAliceが、
のこりの辺をBobが取る。


Aliceのグラフ中の三角形の数と、
Bobのグラフ中の三角形の数の和を求めよ。

制約条件

n, m≦10^6

方針

Aliceの辺1本とBobの辺2本を使った三角形と、
Bobの辺1本とAliceの辺2本を使った三角形の数の合計を求め、
完全グラフの三角形の数から引けば、求める三角形の個数になる。


それはどうやって求めればよいかと言うと、
それぞれの頂点の次数をd[i]とすると、
Σd[i] * (n - 1 - d[i])は、ちょうど引く三角形の個数の2倍になっている。
(全ての引くべき三角形を2回ずつ数えているので)

ソースコード

const int MX = 1000010;
int n, m;
int deg[MX];

int main(){
	scanf("%d%d", &n, &m);
	rep(i, m){
		int a, b;
		scanf("%d%d", &a, &b);
		a--; b--;
		deg[a]++; deg[b]++;
	}
	ll tot = n * (n - 1ll) * (n - 2) / 6;
	ll bad = 0;
	rep(i, n){
		bad += deg[i] * (n - 1 - deg[i]);
	}
	cout << tot - bad / 2 << endl;
	return 0;
}