TOJ 4099 组队要和谐

组队要和谐

时间限制(普通/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对人里不会有相同的二人组合出现

输出

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

样例输入

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

杭电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);
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值