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;
}
发布了47 篇原创文章 · 获赞 26 · 访问量 3万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章