#include<bits/stdc++.h>
using namespace std;
const int maxn = 2500 + 10;
const int N=100 +10;
int X,Y;
int g[maxn][maxn], linker[maxn];
bool vis[maxn];
int mapp[N][N],n,m;
pair<int,int> Map[N][N];
bool dfs(int u){
for(int v=0;v<Y;v++)
if(g[u][v] && !vis[v]){
vis[v]=true;
if(linker[v]==-1 || dfs(linker[v])){
linker[v]=u;
return true;
}
}
return false;
}
int hungary(){
int ans=0;
memset(linker,-1,sizeof(linker));
for(int u=0;u<X;u++){
memset(vis,false,sizeof(vis));
if(dfs(u)) ans++;
}
return ans;
}
void input(){
int N,x,y;
memset(mapp,0,sizeof(mapp));
scanf("%d%d%d",&n,&m,&N);
while(N--){
scanf("%d%d",&x,&y);
mapp[x][y]=1;
}scanf("%d",&N);
while(N--){
scanf("%d%d",&x,&y);
mapp[x][y]=2;
}
}
void solve(){
int row_num=-1,col_num=-1;
for(int i=1;i<=n;i++){
bool flag=true;
for(int j=1;j<=m;j++){
if(mapp[i][j]==1){
if(flag) ++row_num;
Map[i][j].first = row_num;
flag = false;
}
if(mapp[i][j]==2) flag=true;
}
}
for(int j=1;j<=m;j++){
bool flag=true;
for(int i=1;i<=n;i++){
if(mapp[i][j]==1){
if(flag) ++col_num;
Map[i][j].second = col_num;
flag = false;
}
if(mapp[i][j]==2) flag=true;
}
}
X=row_num+1;
Y=col_num+1;
memset(g,0,sizeof(g));
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++) if(mapp[i][j]==1){
g[Map[i][j].first][Map[i][j].second]=1;
}
printf("%d\n",hungary());
}
int main()
{
int t;
scanf("%d",&t);
while(t--){
input();
solve();
}
return 0;
}
[二分图最大匹配=最小覆盖点]uva12549 Sentry Robots
最新推荐文章于 2019-06-16 19:02:08 发布