首页 > 其他 > 详细

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

时间:2020-03-13 22:34:04      阅读:102      评论:0      收藏:0      [点我收藏+]

\(\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;
}

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

原文:https://www.cnblogs.com/Miraclys/p/12489390.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!