这是一题水水的题, 这题用了匈牙利算法,求二分图的最大匹配数, 然后用点数去减, 便是答案。
我自己在理解匈牙利算法的时候想了一个小比喻,便是: A 发现了一个符合他的座位, 但是发现B坐在上面, 于是便对B说, “B 啊, 你还有没有其他的座位可以坐啊, 有的话你去坐那个座位吧。” 然后B往后找其他座位, 找到了一个符合的座位, 发现C坐在上面, 于是便对C说:“ C 啊,你还有没有其他的座位可以坐啊, 有的话你去坐那个座位吧。”然后C也往后找其他的符合条件的座位。。。。。。 最后到了F,F 找到了一个符合的座位, 便打电话给E, E便坐在F原先的位置上, 又打电话给D。。。 。。。最后大家都找到了座位 。怎么样? 形象不形象~~ 哈哈 , 我觉得还可以~~
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#define mem(a) memset(a, 0, sizeof(a))
using namespace std;
bool vis[125], map[125][125];
int lk[125], n;
bool dfs(int a)
{
int i;
for(i = 1;i <= n;i++)
{
if(!vis[i]&&map[a][i])
{
vis[i] = 1;
if(lk[i] == -1||dfs(lk[i]))
{
lk[i] = a;
return true;
}
}
}
return false;
}
int main(int argc, char *argv[])
{
int i, j, k, t, m, res;
scanf("%d",&t);
while(t--)
{
res = 0;
mem(vis);
mem(map);
memset(lk, -1, sizeof(lk));
scanf("%d%d",&n, &m);
for(i = 0;i < m;i++)
{
scanf("%d%d",&j, &k);
map[j][k] = 1;
}
for(i = 1;i <= n;i++)
{
mem(vis);
if(dfs(i))
res++;
}
printf("%d\n", n - res);
}
return 0;
}