感觉说不上来,二分匹配~~
本题是要求图中的最大完全子图中顶点的个数。
由于原图的补图是一个二分图,其最大完全数等价于其补图的最大独立集中元素的个数,于是可以根据二分图的性质求出这个最大独立集。而普通图的最大团则是一个NP问题。
定理:二分图最大独立集中元素个数=顶点数-二分图最大匹配数
最大完全数:图中最大完全子图的顶点个数。
独立集:图中任意两个顶点都不相连的顶点集合。
#include <iostream>
using namespace std;
const int size=202;
bool vis[size];
bool g[size][size];
int linker[size];
int vnum,unum;
bool dfs( int u )
{
for (int v=1;v<=vnum;v++)
{
if (g[u][v]==0&&!vis[v])
{
vis[v]=true;
if (linker[v]==0||dfs(linker[v]))
{
linker[v]=u;
return true;
}
}
}
return false;
}
int hungry()
{
int cent(0);
memset (linker,0,sizeof(linker));
for (int u=1;u<=unum;u++)
{
memset (vis,0,sizeof(vis));
if (dfs(u))
cent++;
}
return cent;
}
int main()
{
int n,t(1);
while (cin>>unum>>vnum>>n,unum+vnum+n)
{
int a,b,ans;
memset (g,0,sizeof(g));
for (int i=0;i<n;i++)
{
cin>>a>>b;
g[a][b]=1;
}
ans=hungry();
cout<<"Case "<<t++<<": ";
cout<<unum+vnum-ans<<endl;
}
return 0;
}