题解 洛谷P6057 【[加油武汉]七步洗手法】

题目描述

给定一张含有 \(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

猜你喜欢

转载自www.cnblogs.com/Akn-Wind/p/luogu-p6057.html
今日推荐