题目链接:http://codeforces.com/problemset/problem/229/C
题目大意:一个n个点的完全图 删掉m条边 求 删掉的边组成的图的三元环的数量+剩下的边组成的图的三元环数量【n,m<=1e6】
思路:
看了下别人的代码。。有点没看懂。。。
说下我的思路吧。。
long long res1=C(n,3) 代表完全图【G1】中三元环的数目
long long res2=0 代表删掉的边组成的图【G2】中三元环的数目
很容易得出一个结论
当读入一条边a.b的时候
res1-=n-G2中当前a的度数-G2中当前b的度数+G2中与a,b同时相连的点数。【也就是以a,b为两个点能组成的还没被删掉的三元环的数目】
res2+=G2中与a,b同时相连的点数
然后我当时就不知道怎么存G2中与a,b,同时相连的点数。。于是开了两个vector去爆了一发。。。
T了我一脸。。
结果发现 我们要求的是res1+res2。。。
我了个擦他们相加之后 G2中与a,b同时相连的点数 这个东西直接被抵消掉了。。
也就是说做法就可以很简单的被缩减成这样。。
long long res=C(n,3);
当读入一条边a,b的时候
res-=n-G2中当前a的度数-G2中当前b的度数;
这样就水了我一脸。。。
好吧。。。删掉一些奇怪的东西之后再缩了下代码就果断拿下最短码了。。。
Code:
#include<cstdio>
int d[1000011],a,b,n,m;
main()
{
scanf("%d%d",&n,&m);
__int64 r=n*(n-1ll)*(n-2)/6;
while(m--)
{
scanf("%d%d",&a,&b);
r-=n-(++d[a])-(++d[b]);
}
printf("%I64d",r);
}