不是匹配

来源:互联网 发布:小微企业会计软件 编辑:程序博客网 时间:2024/05/17 06:11

不是匹配

时间限制: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个活动感兴趣
输出
每组输出一个整数,表示最少天数
样例输入
13 6 1 1 1 2 2 22 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);elseprintf("%d\n",max1+shu);}return 0;}//明明知道咋做,,代码实现能力不行啊 ,好半天了。。。 


0 0
原创粉丝点击