Monochromatic Triangles SCU 2090

(图论与数学结合)Monochromatic Triangles SCU 2090

在这里插入图片描述在这里插入图片描述 Triangle:三角形; monochromatic:单色的;segments:部分;vertices:顶点
题意:第一行输入的代表的是输入图形的测试个数n(1),之后会有n组测试样例;对于每组测试样例:第一行代表的是图中所含的(任意三点不共线)的所有点的个数;第二行代表的是红色线段的个数m,之后会有m对数(数字的范围是1到n),若是p k,则代表p,k连线的线段为红色。本题输出的结果是:在图中所找到的三角形中三条线段都是红色的三角形的个数。

#include<cstdio>
#include<cstring>
typedef long long ll;
ll d[1001];

int main()
{
	int t, n, m, u, v, x;
	ll ans, sum;
	scanf("%d", &t);
	while (t--)
	{
		memset(d, 0, sizeof(d));
		sum = 0;
		scanf("%d%d", &n, &m);
		for (x = 1; x <= m; x++)
		{
			scanf("%d%d", &u, &v);
			d[u]++;
			d[v]++;
		}
		for (x = 1; x <= n; x++)
		{
			sum += (d[x] * (n - 1 - d[x]));
		}
		ans = n * (n - 1) * (n - 2) / 6 - sum / 2;
		printf("%lld\n", ans);
	}
}

对于该代码的一些说明:
Sum:指的是一个点对应的不符合要求的三角形的个数,用它除以二可以得到不符合条件的三角形的总数。While中第一个for循环表示对于输入的点进行标记。第二个for循环表示,计算sum;sum += (d[x] * (n - 1 - d[x])的意思是(d[x]指的是与x这个点相连的红色线段的个数), (n - 1 -d[x]指的则是与x这个点相连的非红色线段的个数),两者相乘得到的便是由该点对应的不符合要求三角形的个数,由于点会存在重复取的问题,所以在最后sum / 2得到的便是不符合要求的三角形的总数。

posted @ 2019-02-25 21:51  LightAc  阅读(121)  评论(0编辑  收藏  举报
返回顶端