组队要和谐
总提交: 0 测试通过: 0
描述
为了备战明年的省赛。我们煞费苦心的crq教练打算从众多大一的ACMER中组织一个主力队伍。
众所周知,大一新生中人才济济,有N个人都有可以参加省赛的实力,为了安排合适的组合。crq教练开始研究这 N 个人中的所有三人组 ( 在crq眼中,这些ACMER的实力都平分秋色,所以只考虑三人的组合) ,但是这样的三人组合实在太多了,所以crq教练只打算研究其中的一部分。
因为在这N个人中有些人在一起做过题,而有些则没有。凭借多年的执教经验,crq发现如果这3名ACMER A, B, C(仅考虑3个人的组合所以顺序无关)中存在 A 和 B一起做过题, 而A和C没一起做过题,那么A就很喜欢跟B交流,而不喜欢跟C交流,这时我们就说 (A, B, C)是一个 " 不和谐 "的队伍。否则,如果三个人互相都一起做过题或者互相都没有做过题,则说(A, B, C)组成了一个"和谐"的队伍,在安排阵容时 crq打算只考虑那些 "和谐" 的队伍组合。
现在,crq知道有N名优秀的大一ACMER ,也知道这其中哪些人在一起做过题,现在他想知道从这 N 个人中可以安排出多少个 " 和谐" 的队伍。但是,crq的数学很差(这个有点瞎扯了,与实际情况不符),于是想借这次ACM比赛的机会向大家求助所以你的任务就是算出有多少个 " 和谐的"队伍。
输入
第1行T表示有T组测试数据,T <= 30
第2行N和M,其中N表示有N名ACMER,编号从1到N,( 1 <= N<=2000 ) ,M 表示 有M 对人他们一起做过题,( 0 <= M <= N * (N - 1) / 2 )
接下来M行每行两个数A B表示A和B一起做过题( 1 <= A, B <= N and A !=B )
输入保证M对人里不会有相同的二人组合出现
输出
对于每组测试数据,输出一个整数,表示可以安排出多少个“和谐”的队伍。
样例输入
3
3 0
3 2
1 2
2 3
6 6
1 2
1 3
2 3
4 5
5 6
4 6
样例输出
1
0
2
重点在于理解
对于每个人来说,朋友里面选一个,非朋友里面选一个
非和谐队伍的情况有两种
一:1和2一起做过题,2和3一起做过题
那么这样的情况在算1的时候会算一遍,算3的时候也会算一遍
二:1和2一起做过题,3和1,2都没做过题
那么这样的情况下算1,2的时候都会算一遍
所以在减去的时候要除以2,因为没种情况会被计算两遍
#include<stdio.h>
#include<string.h>
int map[2010];
int main()
{
int t,i,j,k,n,m,a,b;
scanf("%d",&t);
while(t--)
{
memset(map,0,sizeof(map));
scanf("%d %d",&n,&m);
while(m--)
{
scanf("%d %d",&a,&b);
map[a]++;
map[b]++;
}
__int64 x=1,y=0;
x=x*n*(n-1)*(n-2)/6;
for(i=1;i<=n;i++)
{
y+=map[i]*(n-1-map[i]);
}
x-=y/2;
printf("%I64d\n",x);
}
}