您的位置:首页 > 其它

poj1466 Girls and Boys

2015-02-23 15:14 253 查看
#include <iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
const int MAX=500;
bool used[MAX],ma[250][250];
int boy,gril,m,match[MAX],s;

vector<int> g[MAX];
bool dfs(int v)
{
used[v]=true;
for(int i=0;i<g[v].size();i++)
{
int &u=g[v][i],w=match[u];
if(w<0||!used[w]&&dfs(w))
{
match[u]=v;
match[v]=u;
return true;
}
}
return false;
}
int matching()
{
int ans=0;
memset(match,-1,sizeof(match));
for(int i=1;i<=s;i++)
{
if(match[i]<0)
{
memset(used,0,sizeof(used));
if(dfs(i))
ans++;
}
}
return ans;
}
int main()
{
int num=0;
while(cin>>boy>>gril>>m,boy||gril||m)
{
num++;
s=boy+gril;
for(int i=0;i<MAX;i++)
g[i].clear();
memset(ma,0,sizeof(ma));
int u,v;
for(int i=0;i<m;i++)
{
scanf("%d%d",&u,&v);
ma[u][v]=true;
}
for(int i=1;i<=boy;i++)
{
for(int j=1;j<=gril;j++)
{
if(ma[i][j]==false)
{
g[i].push_back(j+boy);
g[j+boy].push_back(i);
}
}
}
cout<<"Case "<<num<<": "<<s-matching()<<endl;
}
return 0;
}

此题的关键在于转换

此图的补图的最大独立集即是本题的解。

把相互不熟的boy and gril连在一起,那么这张图的最大独立集里面的元素则是两两之间没有联系,即相互之间都熟悉。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: