[Jzoj] 2308. 聚会

题目描述

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

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

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

题目解析

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

因为匹配总是是确定的,为 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);
	 }
}

猜你喜欢

转载自blog.csdn.net/weixin_43909855/article/details/89418767