根據輸入易得某點有多少屬於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);
}