題意:有N個學生,已知每個學生與其他人的romantic關係,問有多少人沒這個關係。
注:只有男生和女生可能有romantic關係。
分析:男生和女生分別爲兩個點集。此題實質爲求最大獨立集。
最大獨立集=頂點數-最大匹配數。(此題由於給出的是每個學生的romantic關係,
所以最大匹配數要除2)
二分圖中的邊都是 單向的
代碼:
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int g[1010][1010];
int vis[1010];
int match[1010];
int n;
bool dfs(int u)
{
int i;
for(i=0;i<n;i++)
{
if(g[u][i] && !vis[i])
{
vis[i]=true;
if(match[i]==-1||dfs(match[i]))
{
match[i]=u;
return true;
}
}
}
return false;
}
int main()
{
int i,j,cnt,a,b,m;
while(scanf("%d",&n)!=EOF)
{
memset(g,0,sizeof(g));
memset(match,-1,sizeof(match));
for(i=0;i<n;i++)
{
scanf("%d: (%d)",&a,&b);
for(j=0;j<b;j++)
{
scanf("%d",&m);
g[a][m]=true;
}
}
cnt=0;
for(i=0;i<n;i++)
{
memset(vis,0,sizeof(vis));
if(dfs(i))
cnt++;
}
printf("%d\n",n-cnt/2);
}
return 0;
}