题目描述
给定一张含有 \(n\) 个点的无向完全图,其中 \(m\) 条边是白边,其余是黑边。
现在需要你求出同色的三元环(或者说,三角形)的个数。
题解
同色三元环?不认识?
就是让你求这个图里面有几个三条边是同色的三角形
1 \(O(nm)\) 暴力,然鹅T了
2 数学法(逃)
同色三角形其实难算,那么我们可以算异色三角形,用三角形的总个数减去它的一半
如果一个点可以连出白色边\(x\)条就可以连出黑色边\(n-x-1\)条
所以不同色三角形的个数就是\(x*(n-1-x)\)
用一个 vector 存储白色边上点的信息
之后1-n枚举,套上公式:
sum+=(v[i].size()*(n-v[i].size()-1));
n个点可以构成的三角形个数就是 \(C^n_3\)
它的值就是\(n*(n-1)*(n-2)/(1*2*3)\)
再减去\(sum\)的一半即可
Ac code:
#include<bits/stdc++.h>
using namespace std;
#define long long ll;
vector<int> v[323333];
int n,m,a,b;
ll sum;
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++)
{
scanf("%d%d",&a,&b);
v[a].push_back(b);
v[b].push_back(a);
}
for(int i=1;i<=n;i++)
sum+=(v[i].size()*(n-v[i].size()-1));
cout<<(ll)(n*(n-1)*(n-2)/6-sum/2);
return 0;
}
最后要注意的是开 longlong