60分求助,wa#2#3#5#6
查看原帖
60分求助,wa#2#3#5#6
362627
frank15楼主2021/4/1 19:34

求助!!!

#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;		
//	}
} 
2021/4/1 19:34
加载中...