(图论与数学结合)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得到的便是不符合要求的三角形的总数。