codeforces 229C Triangles

[题目链接]http://codeforces.com/problemset/problem/229/C

[trans]

给定n个节点的完全图,从中选出m条边构成图A,剩余边构成图B,询问图a和图b中的三角形个数

[sol]

完全图中的三角形个数为C(n,3),这些三角形一部分被破坏掉,其余的则形成了图A和图B的三角形,问题等价

于询问破坏掉多少三角形,我们把选出的边成为蓝边,没选的边称为白边,那么破坏的三角形是由蓝边和白

边共同组成的,即计算有蓝边和白边组成的三角形个数。

计算三角形个数可以从两个角度出发,边和点。对于边,损坏的三角形由蓝蓝白或蓝白白组成,提供的特征

没什么明朗的思路,对于点来说,每个损坏三角形由两个点连接的一条蓝边和一条白边,另外一点连接的相

同颜色的边,那么加入一点有k个蓝边,那么一定有(n - 1 -k)条白边,这样就可以形成k * (n-1-k)个损坏

三角形,不必在意第三条边的颜色,ans算了2遍,所以损坏三角形的个数∑ki*(n-1-ki)

#include<cstdio>
#include<iostream>
#include<cstring>
typedef long long ll;
using namespace std;
int f[1000000 + 5];
int main()
{
    int n, m;
    scanf("%d%d", &n, &m);
    for (int i = 0; i < m; i++)
    {
        int x, y;
        scanf("%d%d", &x, &y);
        f[x] ++;
        f[y]++;
    }
    ll ans = 0;
    for(int i = 1; i <= n; i++)
       ans += 1LL* f[i] * (n - 1 -f[i]);
    ans /= 2;
    ans = 1LL * n * (n - 1) * (n - 2) / 6 - ans;
    cout<<ans;
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值