题意
用最少不相交路径,覆盖整个图,关键这里要理解好。
分析
二分图匹配的经典应用之一:最小路径覆盖
最小路径覆盖=点数-最大匹配
于是这题又转化为模板题。
上代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
struct jq
{
int to,next;
}e[100010];
int t,n,m,ans;
int tot,hd[100010];
int link[200],cover[200];
void add(int x,int y)
{
e[++tot]=(jq){y,hd[x]};
hd[x]=tot;
}
bool find(int x)
{
for(int i=hd[x];i;i=e[i].next)
{
int v=e[i].to;
if(!cover[v])
{
cover[v]=1;
int t=link[v];
link[v]=x;
if(t==0||find(t))
{
return true;
}
link[v]=t;
}
}
return false;
}
int main()
{
cin>>t;
while(t--)
{
memset(link,0,sizeof(link));
tot=0;
memset(hd,0,sizeof(hd));
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
add(x,y);
}
for(int i=1;i<=n;i++)
{
memset(cover,0,sizeof(cover));
if(find(i)) ans++;
}
cout<<n-ans<<endl;
ans=0;
}
return 0;
}