蒟蒻求助,全wa
查看原帖
蒟蒻求助,全wa
126334
jr_tat楼主2020/10/11 18:12
#include <bits/stdc++.h>
using namespace std; 
int n,st[101],ba[101],v[101],match[101];//在校学生,回家学生 ,匹配 
vector<int> rel[103];// n+i 表示i的床 
//1. 在校学生 -> 自己的床 
//2. 回家学生不参与二分图匹配 
//3. 两学生认识 :不在校学生连在校学生的床 
bool dfs(int x){
	//cout<<x<<' ';
	for(int i=0;i<rel[x].size();i++){
		int to=rel[x][i];
		if(!v[match[to]]){
			v[match[to]]=1;
			if(match[to]==0||dfs(match[to])){
				match[to]=x;
				return 1;
			}
		}
	}
	return 0;
}
void run(){
    //init
    int num=0;//需要连的人数 
    int ans=0;//匹配结果 
	cin>>n;
	for(int i=1;i<=n*2+1;i++){
		rel[i].clear();
	}
	memset(st,0,sizeof(st));
	memset(ba,0,sizeof(ba));
	memset(match,0,sizeof(match));
	for(int i=1;i<=n;i++){//1.
		cin>>st[i];
		if(st[i]==1){
			rel[i].push_back(i+n);
		    rel[i+n].push_back(i);
		}
	
	}
	for(int i=1;i<=n;i++){//2
		cin>>ba[i];
		if(ba[i]!=1){//需要匹配的人数++ 
			num++;
		}
	}
	for(int i=1;i<=n;i++){//3
		for(int j=1;j<=n;j++){
			int x;
			cin>>x;
			if(j<i)continue;
			if(x==1){//两人认识 
				if(st[i]==1){//i是在校生
					rel[j].push_back(i+n);//j可以睡i的床 
					rel[i+n].push_back(j);
				}
				if(st[j]==1){//j是在校生
					rel[i].push_back(j+n);//i可以睡j的床
					rel[j+n].push_back(i); 
				}
			}
		}
	}
	//
	//check
	/*
	for(int i=1;i<=n;i++){
		for(int j=0;j<rel[i].size();j++){
			cout<<rel[i][j]<<' ';
		}
		cout<<endl;
	}
	*/
	//
	for(int i=1;i<=n;i++){
		if(ba[i]==1)continue;
		memset(v,0,sizeof(v));
		if(dfs(i))ans++;
	}	
	if(ans==num)cout<<"^_^"<<endl;
	else cout<<"T_T"<<endl;
}
int main(int argc, char** argv) {
	int t;
	cin>>t;
	for(int i=1;i<=t;i++){
		run();
	} 
	return 0;
}
2020/10/11 18:12
加载中...