[Jzoj] 2308. 聚会

题目描述

T z d i n Tzdin Tzdin想组织一个圣诞晚会。 N N N位女士和 M M M位男士 ( M > = N ) (M>=N) M>=N会被邀请参加这个聚会。
 
在聚会的开始, T z d i n Tzdin Tzdin会派发一些写着某位男士信息的卡片给每位女士;每位女士都会收到若干张这种卡片。然后每位女士可以从她收到的卡片里挑选一位男士作为她的伴侣。

我们可以认为经过 T z d i n Tzdin Tzdin的引导,每位女士都一定可以挑选到一位男士作为他的伴侣,而每位男士最多成为 1 1 1位女士的伴侣。

T z d i n Tzdin Tzdin想知道的是,有哪些男士,无论女士们怎么选择,最终都一定会拥有伴侣。

题目解析

先做一次最大匹配,然后看看对于每一个被匹配的男士,如果匹配他的女士不能被匹配到除该男士以外的人,那么答案 + 1 +1 +1

因为匹配总是是确定的,为 n n n

代码

#include<bits/stdc++.h>
using namespace std;
int n,m,x,y;
vector<int> a[1005];
bool flag[1005];
int link[1005],f[1005];
bool find(int x)
{
	for(int i=0;i<a[x].size();i++)
	 if(!flag[a[x][i]])
	 {
	   int j=a[x][i];
	   flag[j]=1;
	   int q=link[j];
	   link[j]=x;
	   if(!q||find(q)) return true;
	   link[j]=q;
	 }
	 return false;
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
	{
	  scanf("%d",&x);
	  while(x--)
	   scanf("%d",&y),a[i].push_back(y);
	}
	for(int i=1;i<=n;i++)
	{
	  memset(flag,0,sizeof(flag));
	  find(i);
	}
	memcpy(f,link,sizeof(link));
	for(int i=1;i<=m;i++)
	 if(f[i])
	 {
	   memset(flag,0,sizeof(flag));
	   flag[i]=1;
	   memcpy(link,f,sizeof(f));
	   if(!find(link[i]))
	    printf("%d\n",i);
	 }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值