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);
}


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