poj 3692(二分匹配)

感觉说不上来,二分匹配~~


本题是要求图中的最大完全子图中顶点的个数。

由于原图的补图是一个二分图,其最大完全数等价于其补图的最大独立集中元素的个数,于是可以根据二分图的性质求出这个最大独立集。而普通图的最大团则是一个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;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值