题意:
给定一个图,求这个图以及它的补图中长度为3的环的数目
思路:
一道不错的思维题
为了方便表述,定义原图给出的边为实边,补图的边为虚边
那么所有三角环的组成一共有4种格式
为了制定出满足题意的规则,设:
a:一条虚边+一条实边 的点数
b:两条虚边的点数
c:两条实边的点数
根据4种格式的三角环可以得到联立方程组:
对应的意思为:
1:两条虚边+一条实边的三角环的贡献为0
2:两条实边+一条虚边的三角环的贡献为0
3:三条虚边的三角环的贡献为1
4:三条实边的三角环的贡献为1
这样很容易的出一组解,为了避免浮点数运算,可以令:a = 1 , b = 2 ,c = 2,
最后将结果除6就是答案
同样的,可以拿总三角环的数目减去同时含有实边和虚边的三角环的数目,那么可得:
同样的为了避免浮点数运算,可以令:a = 1 , b = c = 0
最后拿总方案数减去结果除以2得到答案
很神奇的一种思维方法
代码:
#include<bits/stdc++.h>
const int N = 1e6+10;
using namespace std;
int n,m,du[N],a,b;
long long work(long long d){return d * (n-d-1) ;}
int main()
{
scanf("%d%d",&n,&m);
while(m--){
scanf("%d%d",&a,&b);
du[a]++;du[b]++;
}long long ans = 0;
for(int i=1;i<=n;i++)ans += work(du[i]);
printf("%I64d\n",1LL*n*(n-1)*(n-2)/6-ans/2);
return 0;
}