/*
最小边覆盖 = 顶点数-最大匹配
*/
#include<iostream>
#include<cstdio>
#include<cstring>
const int maxn = 125;
using namespace std;
int link[maxn],vis[maxn];
struct node
{
int v, next;
};
node e[maxn*1000];
int head[maxn],tot;
void Init()
{
tot = 0;
memset(head, -1, sizeof(head));
memset(link, -1, sizeof(link));
}
void Add(int u, int v)
{
e[tot].v = v;
e[tot].next = head[u];
head[u] = tot++;
}
int Find(int x)
{
for(int i = head[x]; i != -1; i = e[i].next)
{
int v = e[i].v;
if(!vis[v])
{
vis[v] = 1;
if(link[v] == -1 || Find(link[v]))
{
link[v] = x;
return 1;
}
}
}
return 0;
}
int main()
{
int t,n,m,u,v;
scanf("%d",&t);
while(t--)
{
Init();
scanf("%d%d",&n,&m);
while(m--)
{
scanf("%d%d",&u,&v);
Add(u, v);
}
int cnt = 0;
for(int i = 1; i <= n; i++)
{
memset(vis, 0, sizeof(vis));
if(Find(i))
cnt++;
}
printf("%d\n",n-cnt);
}
return 0;
}
二分匹配_HDU_1151
最新推荐文章于 2015-08-28 13:05:47 发布