CF - 229C - 想法题

一个完全图中m条边属于Alice..剩下的属于Bob..求Alice和Bob分别用属于自己的边能得到的三角形个数之和..分开来想非常麻烦..似乎也没得办法..何不逆转思维..一个三角形若不属于Alice也不属于Bob..那么必然是其3条边中既有属于Alice的也有属于Bob的...称这种三角形为 不统计三角形..


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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章