Triangles
Accept:12 Submit:28
Time Limit:1000MS Memory Limit:65536KB
Description
There are points given in a space. There are no three points, such that they lie on the same straight line. Each pair of points is connected by a segment coloured red or black. Each triangle, whose sides have the same colour is called a monochromatic triangle. We are given a list of all red segments and we want to find the number of all monochromatic triangles.
InputFormat
The first line is an integer T(1≤T≤20) indicating the case number.
For each case,the first line is N(1≤N≤1000) indicating the number of points and M(1≤M≤1000000) indicating the number of red edges.
In each of the following M lines there are two integers x and y separated by a single space(1≤x,y≤N). They are numbers of vertices which are end points of a red segment.
OutputFormat
For each case output the number of monochromatic triangles(which all 3 edges are same color).
SampleInput
1
6 9
1 2
2 3
2 5
1 4
1 6
3 4
4 5
5 6
3 6
SampleOutput
2
第三场新生排位赛的C题,比赛时看题面就吓到了,但后来听学长讲过后,发现经过转换后是一道很简单的数学题。
给出n个点构成的一个完全图,图中的边有两种颜色,红色和黑色,求同色边构成的三角形有多少个。
首先我们知道图中三角形总数为C(n,3)
对于每一个点i,我们可以统计出由它连出去的红色边数red[i]和黑色变数n-1-red[i],这样该点连出去的不同色三角形就是red[i]*(n-1-red[i])
将所有点连出去的不同色三角形数目1求和再除以2(因为每条边被计算了两次)就得到图中不同色三角形的总数。
三角形总数减去不同色三角形数就是同色三角形数
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 5 using namespace std; 6 7 long red[1001]; 8 9 int main() 10 { 11 int t; 12 long m,n; 13 14 scanf("%d",&t); 15 16 while(t--) 17 { 18 int a,b; 19 long ans,total,dif=0; 20 21 memset(red,0,sizeof(red)); 22 23 scanf("%ld %ld",&n,&m); 24 total=n*(n-1)*(n-2)/6; 25 26 for(int i=1;i<=m;i++) 27 { 28 scanf("%d %d",&a,&b); 29 red[a]++; 30 red[b]++; 31 } 32 33 for(int i=1;i<=n;i++) 34 dif+=red[i]*(n-1-red[i]); 35 ans=total-dif/2; 36 37 printf("%ld ",ans); 38 } 39 40 return 0; 41 }