您的位置:首页 > 其它

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

2017-01-20 07:41 260 查看

原题:

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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: