题意:
给出n个点,n个点构成了完全图,每条边是红色或者是蓝色,问这个图中有多少个三角形三条边都是同一个颜色。
思路:
本想暴力,看见榜单上大家都TLE了,不敢暴力了,就找规律。
画图发现,如果三个点的边不是同一种颜色,那么一定有两个点连着不同颜色的边,所以我们统计每个点连着的红色边和蓝色边的个数,把它们相乘,累加之后除以二代表了不是三条边颜色相同的三角形的个数,用C(n,3)一减即可。
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
#include<map>
#include<stack>
#include<cmath>
#include<cstdlib>
#include<climits>
#include<sstream>
using namespace std;
int color[1005][3];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
memset(color,0,sizeof color);
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
{
int tmp;
scanf("%d",&tmp);
color[i][tmp]++;
color[j][tmp]++;
}
int ans=n*(n-1)*(n-2)/3/2;
int tmp=0;
for(int i=1;i<=n;i++)
tmp+=(color[i][0]*color[i][1]);
printf("%d\n",ans-tmp/2);
}
return 0;
}