POJ3692 二分图最大团 最大独立集

本质是最大团的问题。

转化成补集的最大独立集的问题。

这题的巧妙之处就在此。

#include<iostream>
using namespace std;
const int N=205;
int link[N];
bool visit[N];
bool match[N][N];
int g,b,m;
bool dfs(int u)
{
for(int i=1;i<=b;i++)
if(!visit[i]&&!match[u][i])
{
visit[i]=true;
if(link[i]==-1||dfs(link[i]))
{
link[i]=u;
return true;
}


}
return false;
}
int main()
{
int cases=1;
while(scanf("%d%d%d",&g,&b,&m),g!=0||b!=0||m!=0)
{
memset(match,false,sizeof(match));
while(m--)
{
int u,v;
scanf("%d%d",&u,&v);
match[u][v]=true;
}
int ans=b+g;
memset(link,-1,sizeof(link));
for(int i=1;i<=g;i++)
{
memset(visit,0,sizeof(visit));
if(dfs(i))
ans--;
}
printf("Case %d: %d\n",cases++,ans);
}
return 0;
}

posted on 2011-08-27 00:02  不是我干的  阅读(113)  评论(0)    收藏  举报