2017.1.19【初中部 】普及组模拟赛C组 小x的三角形 题解

来源:互联网 发布:ps命令详解 linux 编辑:程序博客网 时间:2024/05/19 00:53

原题:

http://172.16.0.132/junior/#contest/show/1369/1

题目描述:

小x和小o在一起研究各种图形的性质。小x发明了一个问题:一个完全无向图有n个顶点,选择m条边得到它们,并将剩余的 n(n-1)/2-m条边给小o。
小x和小o喜欢图中的三角形,他们想知道他们得到的边所形成的图共形成了多少个三角形。
图的顶点从1到n编号。

输入:

第一行包含两个用空格隔开的整数n和m,分别表示顶点数和小x选取的边数。
接下来m行每行两个整数ai,bi,表示小x选取的第i条边连接顶点ai,bi,数据保证小x得到的图和初始的完全图无重边和自环。

输出:

输出一行一个整数,小x和小o得到的图所包含三角形的总数。

样例输入:

样例输入1:
5 5
1 2
1 3
2 3
2 4
3 4

样例输入2:
5 3
1 2
2 3
1 3

样例输出:

样例输出1:
3

样例输出2:
4

数据范围限制:

对于20%的数据 1<=n<=20
对于60%的数据 1<=n<=100
对于100%的数据 1<=n<=20000, 0<=m<=10^6,m<=n(n-1)/2,1<=ai,bi<=n,ai≠bi

样例解释:

第一个样例,小x得到的图有两个三角形:(1,2,3)和(2,3,4),小o有一个三角形(1,4,5),所以总数是3。
第二个样例,小x的图只有一个三角形(1,2,3),小o的图有3个三角形(1,4,5),(2,4,5)和(3,4,5),所以总数是4。

分析:

统计每个数字出现的个数,然后将(数字的个数*(n-数字的个数-1))加入答案中,最后减去(n(n-1)(n-2)/6);

实现:

#include<cstdio>long long n, m, i, a, b, bz[20001],s1, s2;int main(){    freopen("triangles.in", "r", stdin); freopen("triangles.out", "w", stdout);    scanf("%lld%lld", &n, &m);    for (i = 1; i <= m; i++)    {        scanf("%lld%lld", &a, &b);        bz[a]++; bz[b]++;    }    for (i = 1; i <= n; i++)        s2 += bz[i] * (n - bz[i] - 1);    s1 = (n * (n - 1) * (n - 2)) / 6;    s2 /= 2;    printf("%lld\n", s1 - s2);}
0 0
原创粉丝点击