题目描述
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);
}
}