链接
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4256
题解
直接统计同色三角形不好弄,我可以用总数减去非同色三角形
一个非同色三角形中肯定存在恰好两个端点,其所在的两条边异色
因此我可以统计每个点连出去的红边个数
r
e
d
(
i
)
red(i)
red(i)和蓝边个数
b
l
u
e
(
i
)
blue(i)
blue(i)
答案就是
C
n
3
−
∑
r
e
d
(
i
)
b
l
u
e
(
i
)
2
C_n^3-{\sum red(i)blue(i)\over2}
Cn3−2∑red(i)blue(i)
代码
//计数题
#include <bits/stdc++.h>
#define maxn 1010
#define cl(x) memset(x,0,sizeof(x))
using namespace std;
int N, blue[maxn], red[maxn];
int read(int x=0)
{
int c, f=1;
for(c=getchar();!isdigit(c);c=getchar())if(c=='-')f=-1;
for(;isdigit(c);c=getchar())x=(x<<1)+(x<<3)+c-48;
return f*x;
}
void init()
{
int i, j, x;
cl(red), cl(blue);
N=read();
for(i=1;i<=N;i++)for(j=i+1;j<=N;j++)
{
x=read();
if(x)red[i]++, red[j]++;
else blue[i]++, blue[j]++;
}
}
void work()
{
int cnt=0, i;
for(i=1;i<=N;i++)cnt+=red[i]*blue[i];
printf("%d\n",N*(N-1)*(N-2)/6-cnt/2);
}
int main()
{
int T=read();
while(T--)init(), work();
return 0;
}