记录编号 133621 评测结果 AAAAAAAAAA
题目名称 [ZJOI 2009] 假期的宿舍 最终得分 100
用户昵称 Gravatarztx 是否通过 通过
代码语言 C++ 运行时间 0.038 s
提交时间 2014-10-28 14:08:28 内存使用 0.30 MiB
显示代码纯文本
/*
	author :hzoi_ztx
	title  :cogs 1356. Dormitory
	ALG    :二分图匹配
	CMT    :

	[2014 10 27]
*/

#include <cstdio>
#include <cstring>

#define  maxn  51

int T ;
int n ;
int pre[maxn] ;
int flag[maxn] ;
int flag2[maxn] ;
int g[maxn][maxn] ;
bool visit[maxn] ;

inline bool find(int u) {
	for (int v = 1 ; v <= n ; v ++ ) {
		if (!g[u][v] || visit[v]) continue ;
		visit[v] = true ;
		if (!pre[v] || find(pre[v])) {
			pre[v] = u ; return true ;
		}
	}
	return false ;
}

inline void KM() {
	int i ;
	for (i = 1 ; i <= n ; i ++ ) {
		if (flag[i]==0 || (flag[i]==1&&flag2[i]==0)) {
			memset(visit , 0 , sizeof(visit)) ;
			if (!find(i)) {
				puts("T_T") ;
				return ;
			}
		}
 	}
	puts("^_^") ;
}

int main() {
	#define READ
	#ifdef  READ
	    freopen("zjoi09holiday.in" ,"r",stdin ) ;
	    freopen("zjoi09holiday.out","w",stdout) ;
	#endif
	int i , j ;
	scanf("%d", &T ) ;
	while ( T -- ) {
		scanf("%d", &n ) ;
		for (i = 1 ; i <= n ; i ++ ) {
			scanf("%d", &flag[i] ) ;
			if (flag[i]>>1) flag[i] = 0 ;
			pre[i] = 0 ;
			/*是否是宠物*/
		}
		for (i = 1 ; i <= n ; i ++ ) {
			scanf("%d", &flag2[i] ) ;
			if (flag2[i]>>1) flag2[i] = 0 ;
			/*是否出去玩*/
		}
		for (i = 1 ; i <= n ; i ++ ) {
			for (j = 1 ; j <= n ; j ++ ) {
				scanf("%d", &g[i][j] ) ;
				if (g[i][j]>>1) g[i][j] = 0 ;
				if (i == j) g[i][j] = 1 ;
				if (!flag[j]) g[i][j] = 0 ;
			}
		}/*建图*/
		KM() ;
	}
	#ifdef  READ
	    fclose(stdin ) ;
	    fclose(stdout) ;
	#else
	    getchar() ; getchar() ;
	#endif
	return 0 ;
}