http://poj.org/problem?id=3692
在网上找二分图模板题找到了这道,由于不会二分图一直想不懂,后来发现,二分图肯定是分成两部分,每部分自身不能相连,但是这道题男同学之间全部互相连接表示熟悉,这是不对的,所以我们转换为补图,这时候跑一跑二分图匹配发现,算到一个最大互不相识的组合,就是最多能有几对人不互相熟悉,那么我们要让剩下的人相识,那么就是全部人的人数减去这个最大互不相识的组合(也就是去掉其中一个人)不就好了?game over。
然后去看了看,这是二分图中的,最小路径覆盖的求法。
代码如下:
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int MAXN = 205;
int uN,vN;
int G[MAXN][MAXN];
int linker[MAXN];
bool used[MAXN];
bool dfs(int u)
{
int v;
for(v = 1; v <= vN; v++)
if(!G[u][v] && !used[v])
{
used[v] = true;
if(linker[v] == -1 || dfs(linker[v]))
{
linker[v] = u;
return true;
}
}
return false;
}
int hungary()
{
int res = 0;
int u;
memset(linker, -1 ,sizeof(linker));
for(u = 1; u <= uN; u++)
{
memset(used, 0, sizeof(used));
if(dfs(u))
res++;
}
return res;
}
int main()
{
int m, x, y, k = 1;
while(cin >> uN >> vN >> m)
{
if(uN + vN + m == 0)
break;
memset(G, 0, sizeof(G));
while(m--)
{
scanf("%d%d", &x, &y);
G[x][y] = 1;
}
printf("Case %d: %d\n", k++, uN + vN - hungary());
}
return 0;
}