刚学C++0.5天的超级无敌大蒟蒻求问,爆零?!
查看原帖
刚学C++0.5天的超级无敌大蒟蒻求问,爆零?!
781528
tis00楼主2023/6/1 16:29

思路:匈牙利算法求二分图最大匹配,左部为非回家者,右部为在学校者。

或许已然不复,或许久存苍穹。

代码如下:

#include<bits/stdc++.h>
using namespace std;
int T,n,stu[105],home[105],vis[105],pre[105],kno[105][105];
int find(int u){
	if(vis[u]) return 0;
	vis[u]=1;
	for(int v=1;v<=n;v++){
		if(!kno[u][v]||!stu[v]) continue;
		if(!pre[v+n]||find(pre[v+n])){
			pre[v+n]=u;
			return 1;
		}
	}
	return 0;
}
int main(){
	scanf("%d",&T);
	while(T--){
		scanf("%d",&n);
		for(int i=1;i<=n;i++) scanf("%d",&stu[i]);
		for(int i=1;i<=n;i++) scanf("%d",&home[i]);
		memset(pre,0,sizeof(pre));
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n;j++) scanf("%d",&kno[i][j]);
			if(stu[i]) kno[i][i]=1;
		}
		int flag=1;
		for(int i=1;i<=n;i++){
			memset(vis,0,sizeof(vis));
			if(!home[i]) flag&=find(i);
		}
		if(flag) printf("^_^\n");
		else printf("T_T\n");
	}
	return 0;
}
2023/6/1 16:29
加载中...