TTTTTTTTTT TTTTT CF 229C 三角形数量

题意: 有一个无向完全图(任意两个节点之间均有一条边),包含 n(1<=n<=10^6) 个顶点,现在有两个人A 和 B,A从这个无向图中取出 m(0<=m<=10^6) 条边出来,这样就把真个完全图分成了两个子图 A 和 B,要求统计两个子图中总共含有的“三角形”的个数。“三角形”的意思说的就是一个含有三个节点的环;

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <algorithm>
#include <set>
using namespace std;
typedef long long ll;
typedef unsigned long long Ull;
#define MM(a,b) memset(a,b,sizeof(a));
const double eps = 1e-10;
const int inf = 0x3f3f3f3f;
const double pi=acos(-1);
const int mod=100000000;
ll max(ll a,ll b)
{return a>b?a:b;};
int min(int a,int b)
{return a<b?a:b;};

ll deg[1000005];
int main()
{
    ll n,m;
    while(~scanf("%lld %lld",&n,&m))
    {
        ll ans=n*(n-1)*(n-2)/6,temp=0;
        MM(deg,0);
        int u,v;
        for(int i=1;i<=m;i++)
         {
             scanf("%d %d",&u,&v);
             deg[u]++;deg[v]++;
         }
        for(int i=1;i<=n;i++)
            temp+=deg[i]*(n-1-deg[i]);
        printf("%lld
",ans-temp/2);
    }
    return 0;
}

  分析:见链接,关键的是deg[i]*(n-1-deg[i])代表被拆掉的三角形的数量(因为原图中任意两条边都可以组成一个三角形

原文地址:https://www.cnblogs.com/smilesundream/p/5387147.html