TOJ 4099 组队要和谐

来源:互联网 发布:淘宝美工怎么优化店铺 编辑:程序博客网 时间:2024/04/29 03:49

组队要和谐

时间限制(普通/Java):1000MS/1000MS     运行内存限制:65536KByte
总提交: 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对人里不会有相同的二人组合出现

输出

对于每组测试数据,输出一个整数,表示可以安排出多少个“和谐”的队伍。

样例输入

33 03 21 22 36 61 21 32 34 55 64 6

样例输出

102

杭电4503,植树节,和这道题目是一样一样的。
重点在于理解
对于每个人来说,朋友里面选一个,非朋友里面选一个
非和谐队伍的情况有两种
一: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);}}

原创粉丝点击