根据输入易得某点有多少属于Alice的边,记为k...进而算出其有多少属于Bob的边=n-1-k...那么含这个点的不统计三角形有k*(n-1-k)个..而一个不统计三角形中一定有两个点是这种情况..所以若将所有点的k*(n-1-k)值加起来..再除2...就可以得到不统计三角形的总个数..
用C(n,3)算出完全图中有多少个三角形...减去不统计三角形..就是结果了..
转自 .http://blog.csdn.net/flying_stones_sure/article/details/8037028
#include <iostream>
#include <cstdio>
#include <memory.h>
using namespace std;
const int maxn = 1000002;
int degree[maxn];
int m,n;
void solve()
{
memset(degree,0,sizeof(degree));
int u,v;
while(m--)
{
scanf("%d %d",&u,&v);
degree[u]++;
degree[v]++;
}
__int64 sum = 0;
for(int i=1;i<=n;i++)
{
sum += 1LL * degree[i] * (n - 1 - degree[i]);
}
__int64 ans = 1LL * n * (n - 1) * (n - 2) / 6 - sum / 2;
printf("%I64d\n",ans);
return;
}
int main()
{
while(~scanf("%d %d",&n,&m))
{
solve();
}
return 0;
}
还有一个代码:更让我理解到, 真是完全是想法题。。。
#include<cstdio>
int d[1000011],a,b,n,m;
main()
{
scanf("%d%d",&n,&m);
__int64 r=n*(n-1LL)*(n-2LL)/6LL;
while(m--)
{
scanf("%d%d",&a,&b);
r-=n-(++d[a])-(++d[b]);
}
printf("%I64d",r);
}