Description

小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏――矩阵游戏。矩阵游戏在一个N*N黑白方阵进行(如同国际象棋一般,只是颜色是随意的)。每次可以对该矩阵进行两种操作:

行交换操作:选择矩阵的任意两行,交换这两行(即交换对应格子的颜色)

列交换操作:选择矩阵的任意两列,交换这两列(即交换对应格子的颜色)

游戏的目标,即通过若干次操作,使得方阵的主对角线(左上角到右下角的连线)上的格子均为黑色。

对于某些关卡,小Q百思不得其解,以致他开始怀疑这些关卡是不是根本就是无解的!!于是小Q决定写一个程序来判断这些关卡是否有解。

Input

第一行包含一个整数T,表示数据的组数。

接下来包含T组数据,每组数据第一行为一个整数N,表示方阵的大小;接下来N行为一个N*N的01矩阵(0表示白色,1表示黑色)。

Output

包含T行。对于每一组数据,如果该关卡有解,输出一行Yes;否则输出一行No。

Sample Input

2

2

0 0

0 1

3

0 0 1

0 1 0

1 0 0

Sample Output

No

Yes

Hint

对于20%的数据,N ≤ 7

对于50%的数据,N ≤ 50

对于100%的数据,N ≤ 200

Solution

二分图匹配,判断匹配数是否为n即可。时间复杂度\(O(n^{\frac{5}{2}})\)

Code

  1. #include <stdio.h>
  2. #include <string.h>
  3. #define MN 505
  4. #define S 0
  5. #define T 1001
  6. #define R register
  7. #define inf 0x3f3f3f3f
  8. #define file(x) freopen(#x".in","r",stdin);freopen(#x".out","w",stdout);
  9. #define end fclose(stdin);fclose(stdout)
  10. inline int read(){
  11. R int x; R bool f; R char c;
  12. for (f=0; (c=getchar())<'0'||c>'9'; f=c=='-');
  13. for (x=c-'0'; (c=getchar())>='0'&&c<='9'; x=(x<<3)+(x<<1)+c-'0');
  14. return f?-x:x;
  15. }
  16. inline int min(int a,int b){return a<b?a:b;}
  17. int n,tt,to[MN*MN<<1],nxt[MN*MN<<1],cap[MN*MN<<1],hd[MN<<1],en;
  18. int lev[MN<<1],iter[MN*MN<<1],que[MN<<1],h,t;
  19. inline void ins(int x,int y,int v){to[++en]=y,nxt[en]=hd[x],cap[en]=v,hd[x]=en;}
  20. inline void insw(int x,int y,int v){ins(x,y,v);ins(y,x,0);}
  21. inline bool bfs(){
  22. memset(lev,-1,sizeof(lev));
  23. h=0,t=1;que[1]=S;lev[S]=0;
  24. while (h<t){
  25. R int u=que[++h];
  26. for (R int i=hd[u]; ~i; i=nxt[i])
  27. if (cap[i]&&!(~lev[to[i]])){
  28. lev[to[i]]=lev[u]+1;
  29. que[++t]=to[i];
  30. }
  31. }memcpy(iter,hd,sizeof(hd));
  32. return ~lev[T];
  33. }
  34. int dfs(int u,int f){
  35. if (u==T) return f;
  36. R int res=0;for (R int &i=iter[u]; ~i; i=nxt[i])
  37. if (cap[i]&&lev[to[i]]==lev[u]+1){
  38. R int w=dfs(to[i],min(cap[i],f-res));
  39. res+=w;cap[i]-=w;cap[i^1]+=w;
  40. if (res==f) return res;
  41. }if (!res) lev[u]=-1;
  42. return res;
  43. }
  44. inline int dinic(){
  45. R int flow=0,w;
  46. while(bfs()) while(w=dfs(S,inf)) flow+=w;
  47. return flow;
  48. }
  49. int main(){
  50. tt=read();while(tt--){
  51. n=read();memset(hd,-1,sizeof(hd));
  52. en=-1;for (R int i=1; i<=n; ++i){
  53. insw(S,i,1);insw(i+n,T,1);
  54. for (R int j=1; j<=n; ++j)
  55. if (read())
  56. insw(i,j+n,inf);
  57. }if (dinic()==n) puts("Yes");
  58. else puts("No");
  59. }return 0;
  60. }

【BZOJ1059】【ZJOI2007】矩阵游戏的更多相关文章

  1. BZOJ1059 ZJOI2007 矩阵游戏 【二分图匹配】

    BZOJ1059 ZJOI2007 矩阵游戏 Description 小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏--矩阵游戏.矩阵游戏在一个N*N黑白方阵进行(如同国际象棋一 ...

  2. [bzoj1059][ZJOI2007]矩阵游戏_二分图最大匹配

    矩阵游戏 bzoj-1059 ZJOI-2007 题目大意:给定一个n*n的棋盘,上面有一些格子被染黑,剩下都是白色.你每次可以交换两列或者两行,问你能否通过一系列操作使得棋盘的主对角线上的格子全是黑 ...

  3. [bzoj1059] [ZJOI2007] 矩阵游戏 (二分图匹配)

    小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏--矩阵游戏.矩阵游戏在一个N *N黑白方阵进行(如同国际象棋一般,只是颜色是随意的).每次可以对该矩阵进行两种操作:行交换操作:选 ...

  4. [BZOJ1059]:[ZJOI2007]矩阵游戏(二分图匹配)

    题目传送门 题目描述 小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏——矩阵游戏.矩阵游戏在一个N×N黑白方阵进行(如同国际象棋一般,只是颜色是随意的).每次可以对该矩阵进行两种 ...

  5. BZOJ1059 [ZJOI2007]矩阵游戏 二分图匹配 匈牙利算法

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1059 题意概括 有一个n*n(n<=200)的01矩阵,问你是否可以通过交换整行和整列使得左 ...

  6. bzoj1059: [ZJOI2007]矩阵游戏

    二分图匹配. 补充,感觉之前说的不够详细,如果有完美匹配的话,每行都有一个对应的列,那么换来换去以后,对角线就全黑了... #include<cstdio> #include<alg ...

  7. bzoj 1059: [ZJOI2007]矩阵游戏 二分图匹配

    1059: [ZJOI2007]矩阵游戏 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1891  Solved: 919[Submit][Statu ...

  8. BZOJ 1059 [ZJOI2007]矩阵游戏

    1059: [ZJOI2007]矩阵游戏 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2707  Solved: 1322[Submit][Stat ...

  9. bzoj 1059 [ZJOI2007]矩阵游戏(完美匹配)

    1059: [ZJOI2007]矩阵游戏 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2993  Solved: 1451[Submit][Stat ...

  10. BZOJ 1059: [ZJOI2007]矩阵游戏( 匈牙利 )

    只要存在N个x, y坐标均不相同的黑格, 那么就一定有解. 二分图匹配, 假如最大匹配=N就是有解的, 否则无解 ------------------------------------------- ...

随机推荐

  1. Beta Scrum Day 7

    听说

  2. alpha-咸鱼冲刺day2-紫仪

    总汇链接 一,合照 emmmmm.自然是没有的. 二,项目燃尽图 三,项目进展 今天并没有什么进展,弄了好久好像也只研究出怎么把JS的功能块插入进去.html的信息提交这些还不知道要怎么弄. 四,问题 ...

  3. Flask 扩展 国际化 本地化

    pip install flask-babel 先初始化一个Flask-Babel的实例 from flask import Flask from flask.ext.babel import Bab ...

  4. 树莓派3启动wifi并且配置wifi

    概述 树莓派3内置了wifi和蓝牙模块,我们不用像以前的版本那样,再去购买一个外接的模块练到raspberry上. 当我们第一次启动了树莓派的时候,必然使用了网线,但是之后的每一次使用,我们当然更希望 ...

  5. JAVA中最容易让人忽视的基础。

    可能很多找编程工作的人在面试的时候都有这种感受,去到一个公司填写面试试题的时候,多数人往往死在比较基础的知识点上.不要奇怪,事实就是如此一般来说,大多数公司给出的基础题大概有122道,代码题19道左右 ...

  6. java利用iTextWorker生成pdf

    使用itext生成pdf,在linux环境下,中文全部失踪,因为itext要在linux下支持中文字体需要引入itext-asian, 并添加一个字体类. public static class Pd ...

  7. java截取一个字符串正数或倒数某个特定字符前后的内容

    取出正数第二个“.”后面的内容 public class TestCode { public static void main(String[] args) { String str ="2 ...

  8. 更优雅的方式: JavaScript 中顺序执行异步函数

    火于异步 1995年,当时最流行的浏览器--网景中开始运行 JavaScript (最初称为 LiveScript). 1996年,微软发布了 JScript 兼容 JavaScript.随着网景.微 ...

  9. java的<<左移,>>右移,>>>无符号右移

    >>右移 右移,道在二进制中,假设用一个32位的Int表示一个64,那么高位就都是0,所以当我们把整个二进制数右移,如0100000 >> 2 = 0001000,可以看到右移 ...

  10. Spring之AOP编程

    一.AOP简介     AOP的英文全称是Aspect Oriented Programming,意为:面向切面编程.     AOP采取横向抽取的机制,取代了传统纵向继承体系的代码复用.AOP常用于 ...