求助!!!
#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
const int maxn=300000;
int T,A,B,M,U,V;
int ans,cnt1,cnt2;
int a[maxn],b[maxn];
int use1[maxn],vis[maxn];
struct node{
int MATCH,CLOCK;
}match[maxn];
vector<int> vp[maxn],v[maxn];
void init(){
for(int i=1;i<=B;i++)
v[i].clear();
return ;
}
int dfs(int k){
for(int i=0;i<v[k].size();i++)
if(use1[v[k][i]]==cnt1&&vis[v[k][i]]!=cnt2){
vis[v[k][i]]=cnt2;
if(match[v[k][i]].CLOCK!=cnt1||!match[v[k][i]].MATCH||(match[v[k][i]].CLOCK==cnt1&&dfs(match[v[k][i]].MATCH))){
match[v[k][i]].CLOCK=cnt1;
match[v[k][i]].MATCH=k;
return 1;
}
}
return 0;
}
int count(int x,int y){
++cnt1;
int res=0;
for(int i=0;i<vp[x].size();i++)
use1[vp[x][i]]=cnt1;
++cnt1;
for(int i=0;i<vp[y].size();i++)
if(use1[vp[y][i]]+1==cnt1){
use1[vp[y][i]]=cnt1;
res++;
}
res=B-res;
for(int i=1;i<=B;i++){
// cout<<use1[i]<<' ';
if((b[i]&1)&&use1[i]==cnt1){
cnt2++;
res+=dfs(i);
// cout<<111<<res<<endl;
}
}
return (B-res);
}
bool calc(int k){
int res=0;
while(k){
if(k&1)
res++;
k>>=1;
}
return res;
}
void solve(){
ans=count(0,0);
// cout<<"0 0 0 "<<ans<<endl;
for(int i=1;i<=A;i++){
ans=max(ans,count(i,0)+1);
// cout<<i<<' '<<i<<" 0 "<<ans<<endl;
}
for(int i=1;i<A;i++)
for(int j=i+1;j<=A;j++)
if(((a[i]&1)&&(~a[j]&1))||((a[j]&1)&&(~a[i]&1))){
ans=max(ans,count(i,j)+2);
// cout<<i<<' '<<ans<<endl;
}
printf("%d\n",ans);
}
int main(){
scanf("%d",&T);
while(T--){
init();
scanf("%d%d%d",&A,&B,&M);
for(int i=1;i<=A;i++)
scanf("%d",&a[i]);
for(int i=1;i<=B;i++)
scanf("%d",&b[i]);
while(M--){
scanf("%d%d",&U,&V);
vp[U].push_back(V);
}
for(int i=1;i<=B;i++)
vp[0].push_back(i);
for(int i=1;i<B;i++)
for(int j=i+1;j<=B;j++)
if(((b[i]&1)&&(~b[j]&1))||((b[j]&1)&&(~b[i]&1))&&(~calc(b[i]|b[j])&1)){
if(b[i]&1)
v[i].push_back(j);
if(b[j]&1)
v[j].push_back(i);
// cout<<i<<' '<<j<<endl;
}
solve();
}
// for(int i=0;i<=B;i++){
// for(int j=0;j<v[i].size();j++)
// cout<<v[i][j]<<' ';
// cout<<endl;
// }
}