开始没想到这种方法 很蠢的超时了好几次 最后被学长提醒 才想到原来还可以这么做
首先是题目大意
就是有一个多边形 每个顶点上面有一个灯 每两个灯之间有一条光线 光线有两种颜色 红色和蓝色 分别用0 1表示 输入任意两点之间光线的颜色 问有没有三个点之间的线是同一个颜色
接下来说一下思路 首先题目给的范围是1000个点 数据不大 但是纯纯的暴力枚举肯定会超 所以要变换一个思维进行暴力 既然找三条边颜色一样的很费劲 那就找三条边不全都一样的三角形 再用总的三角形个数减去不符合条件的三角形 就是答案了 首先在输入的时候 记录每个点连出去的边的颜色 一共只有两种颜色 记录起来比较方便 之后走一遍for循环 遍历1000个点 用两种边的个数相乘 这样构成的三角形 一定不是三边同色的 最后一减就是答案了 代码不是很复杂
代码如下
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int an[1010][1010], a[1010], b[1010];
int main()
{
int t;
cin >> t;
while(t--){
int n;
memset(an, 0, sizeof(an));
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
cin >> n;
for(int i = 0; i < n; i++){
for(int j = i+1; j < n; j++){
cin >> an[i][j];
if(an[i][j] == 0){
a[i]++;
a[j]++;
}
else {
b[i]++;
b[j]++;
}
}
}
int ans = 0;
for(int i = 0 ; i < n; i++){
ans += a[i]*b[i];
}
cout << n*(n-1)*(n-2)/6 - ans/2 <<endl;
}
}