Miraclys

一言(ヒトコト)

洛谷P6057 [加油武汉]七步洗手法

\(\Large\textbf{Description: } \large{给定一张含有n个点的无向完全图,其中m条边是白边,其余是黑边。\\现在需要你求出同色的三元环(或者说,三角形)的个数。(1 \leq n \leq 10^{5}, 1 \leq m \leq 3 \times 10^{5})}\\\)

\(\Large\textbf{Solution: } \large{我们可以发现,当我们去计算一个点对相同个数三元环的贡献的时候,虽然有两条变与此点相连,但是另一条边的颜色却不好判断。\\然后,我们可以发现,我们可以计算当前点对不同颜色三元环个数的贡献,我们只需使与此点相连的两边颜色不同,第三边对答案没有影响。\\值得注意的是,当我们这样算完,不同颜色的三元环每个都重复了一次,再除以2即可。\\记得开\text{long long}!!!\\}\)

\(\Large\textbf{Code: }\)

#include <cstdio>
#include <algorithm>
#define LL long long
#define gc() getchar()
#define rep(i, a, b) for (int i = (a); i <= (b); ++i)
using namespace std;
const int N = 10000005;
LL n, m, ans, cur, w[N];

inline int read() {
	char ch = gc();
	int ans = 0;
	while (ch > '9' || ch < '0') ch = gc();
	while (ch >= '0' && ch <= '9') ans = (ans << 1 ) + (ans << 3) + ch - '0', ch = gc();
	return ans;	
}

int main() {
	n = read(), m = read();
	int x, y;
	ans = n * (n - 2) * (n - 1) / 6;
	rep(i, 1, m) {
		x = read(), y = read();
		++w[x], ++w[y];
	}
	rep(i, 1, n) cur += w[i] * (n - w[i] - 1);
	ans -= cur / 2;
	printf("%lld\n", ans);
	return 0;
}
posted @ 2020-03-13 22:06  Miraclys  阅读(164)  评论(0编辑  收藏  举报

关于本博客样式

部分创意和图片借鉴了

BNDong

的博客,在此感谢