根据输入易得某点有多少属于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); }