不是匹配

不是匹配

时间限制: 1000 ms  |  内存限制: 65535 KB
描述
 有N个人,N个活动, 每个人只会对2个或者3个活动感兴趣,
 每个活动也只有两个人或者两个活动对它兴趣,每个人参加一个
 感兴趣的活动需要一天 ,且当天该活动被参加时,其他的人不能参加
 如果每个人都参加完自己有兴趣的活动,应当怎样安排使得所用总天数时间最短
2<= N <=1000, 1<=m<=1000;

输入
一个数T 表示T 组数据
每组一个N表示人数,编号1 -- N , 一个数 m ,接下来m 行每个两个数
x,y, 表示第 x 个人对第y个活动感兴趣
输出
每组输出一个整数,表示最少天数
样例输入
1
3 6 
1 1 
1 2 
2 2
2 3 
3 1 
3 3 
样例输出

2


找出谁参加的活动最多,将这个最多的活动数记为max1,再找哪个活动被参加的最多,将这个被参加最多的活动数记为max2,比较两者大小,如果max2>max1 就输出max2;否则再找出没有被参加的活动数记为shu,并输出shu+max1:

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct node{
	int ren,huodong;
}a[1010];
int t;
int n,m;
int vis[1010][1010];
int jishu[1010];
int suan[1010];
int b[1010];
int main()
{
	scanf("%d",&t);
	while(t--)
	{
		memset(jishu,0,sizeof(jishu));
		memset(suan,0,sizeof(suan));
		memset(b,0,sizeof(b));
		scanf("%d%d",&n,&m);
		for(int i=0; i<=n; i++){
			for(int j=0; j<=n; j++){
				vis[i][j] = 0;
			}
		}
		for(int i=1; i<=m; i++)
		{
			scanf("%d%d",&a[i].ren,&a[i].huodong);
			b[a[i].ren]=1;
			if(vis[a[i].ren][a[i].huodong] == 0){
				jishu[a[i].ren]++;
				suan[a[i].huodong]++;
				vis[a[i].ren][a[i].huodong] = 1;		
			}
		}
		int max1=0,max2=0,shu=0;
		for(int i=1; i<=n; i++){
			if(jishu[i]>max1)	
				max1 = jishu[i];
			if(suan[i]>max2)	
				max2 = suan[i];
		}
		
		for(int i=1;i<=n;i++){
			if(b[i]==0)
			shu++;
		}
		if(max1<max2)
			printf("%d\n",max2);
		else
			printf("%d\n",max1+shu);
	}
	return 0;
}//明明知道咋做,,代码实现能力不行啊 ,好半天了。。。 


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值