1059: [ZJOI2007]矩阵游戏

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 4604  Solved: 2211
[Submit][Status][Discuss]

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
【数据规模】
对于100%的数据,N ≤ 200


通过对行列的移动使黑点移动到正对角线上,
对于一种可行的步骤,至少先移动行与先移动列是一样的;
于是:
如果存在方案,则存在先完成所有列移动再移动行的方案;
讨论这一类方案:
在列操作之后,每行中有黑点的列已经确定了,则该行可以通过移动而贡献到对角线上哪些点,也已经确定了;
但每行只能贡献对角线上的一个点;(注意)
于是有了模糊的二分图匹配的思路;
然后讨论在行操作之前的列操作:
她其实没什么用;
因为她大概可以改变对角线上某一点永远不能被行移动贡献的情况;
但这只是一种拆东墙补西墙的行为,没有意义;
于是直接忽略列操作;
二分图匹配;
在行号和用列好表示的对角线上点间建边
对行和每行的黑点的列编号建边即可;
代码:
 #include<cstdio>
#include<cstring>
#define INF 2147483000
using namespace std;
int n,m,S,T;
struct ss{
int next,to,w,cp;
}x[];
int first[],num;
int dep[];
int que[];
void bui_(int ,int ,int );
void build(int ,int ,int );
int bfs();
int dfs(int ,int );
int main()
{
int TT,i,j,k,ans,add;
scanf("%d",&TT);
while(TT--){
memset(first,,sizeof(first));num=;ans=;
scanf("%d",&n);
S=,T=(n<<)+;
for(i=;i<=n;i++){
bui_(S,i,);bui_(n+i,T,);
for(j=;j<=n;j++){
scanf("%d",&k);
if(k)
bui_(i,n+j,);
}
}
while(bfs())
while(add=dfs(S,INF))
ans+=add;
if(ans==n)printf("Yes\n");
else printf("No\n");
}
return ;
}
void bui_(int f,int t,int d){
build(f,t,d);x[num].cp=num+;
build(t,f,);x[num].cp=num-;
}
void build(int f,int t,int d){
x[++num].next=first[f];
x[num].to=t;
x[num].w=d;
first[f]=num;
}
int bfs(){
memset(dep,,sizeof(dep));
int h=,t=,j;
que[t]=S;
while(h<t){
++h;
for(j=first[que[h]];j;j=x[j].next)
if(x[j].w&&x[j].to!=S&&!dep[x[j].to]){
dep[x[j].to]=dep[que[h]]+;
que[++t]=x[j].to;
}
}
if(dep[T])return ;
return ;
}
int dfs(int now,int min){
int j,re=;
if(now==T)
return min;
for(j=first[now];j;j=x[j].next)
{
if(x[j].w&&dep[x[j].to]==dep[now]+){
re=dfs(x[j].to,min<x[j].w?min:x[j].w);
if(re){
x[j].w-=re;
x[x[j].cp].w+=re;
return re;
}
dep[x[j].to]=;
}
}
return re;
}

BZOJ P1059 [ZJOI2007]矩阵游戏——solution的更多相关文章

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

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

  2. BZOJ 1059 [ZJOI2007]矩阵游戏

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

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

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

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

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

  5. BZOJ 1059 [ZJOI2007]矩阵游戏 (二分图最大匹配)

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

  6. BZOJ 1059: [ZJOI2007]矩阵游戏 匈牙利算法

    1059: [ZJOI2007]矩阵游戏 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2351  Solved: 1156 题目连接 http:// ...

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

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

  8. BZOJ 1059 [ZJOI2007]矩阵游戏:二分图匹配

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1059 题意: 给你一个n*n的01矩阵. 你可以任意次地交换某两行或某两列. 问你是否可以 ...

  9. bzoj 1059: [ZJOI2007]矩阵游戏【匈牙利算法】

    注意到怎么换都行,但是如果把某个黑方块用在对角线上,它原来所在的行列的的黑方块就都不能用 所以要选出n组不重的行列组合,这里用匈牙利算法做二分图匹配即可(用了时间戳优化) #include<io ...

随机推荐

  1. C++基础知识-inline、const、mutable、this、static

    一.在类定义中实现成员函数inline 类内的成员函实现其实也叫作类内的成员函数定义. 这种直接在类的定义中实现的函数,会被当做inline内联函数来处理. 二.成员函数末尾的const const: ...

  2. Vue-cli 2.9 多页配置及多页面之间的跳转问题

    vue开发,现在大部分做的都是(SPA)应用,但是,由于,需求不同,我们针对的用户需求变更较为,频繁,如果每次都全量打包更新,给开发的自测,及测试妹子的任务就会多,每次都要重新验证一下才放心.所以,想 ...

  3. python 类中的某个函数作为装饰器

    在python的类中,制作一个装饰器的函数, class A: def wrapper(func): ###装饰器 def wrapped(self,*arg,**kwargs) ... return ...

  4. mysql工具——perror(mysql错误代码,查看错误号释义)

    mysql工具——perror(mysql查看错误代码,查看错误号释义) 关键词:mysql错误代码,mysql错误号,perror

  5. 教你制作自己logo专属的图片

    说明:以下教程仅适合对图片分辨率要求不高的情况. 第一步:使用Windows自带的画图工具新建一个250像素*250像素的空白图片. 第二步:使用形状中的三角形,按住Shift键,将三角形拖拉至合适的 ...

  6. 【算法笔记】A1063 Set Similarity

    1063 Set Similarity (25 分)   Given two sets of integers, the similarity of the sets is defined to be ...

  7. tp5.0 根据经纬度 获取附近信息

    自己备注一下 /* *参数说明: *$lng 经度 *$lat 纬度 *$distance 周边半径 默认是500米(0.5Km) */ public function returnSquarePoi ...

  8. linux 命令 htop & 重定向 top, bashrc文件

    最近在用linux服务器跑程序,有几条linux命令还蛮重要的,总结一下: 1. 直接跑代码: python test.py 2. 若想程序在后台跑,即使本地和服务器断开也能运行: nohup pyt ...

  9. 安装nagios出现的错误

    最近安装nagios时,检查的的状态都没有什么问题,就是监控系统的状态显示不出来 检测的结果如下: [root@lb02 ~]# /etc/init.d/httpd start Starting ht ...

  10. 16个最佳响应式HTML5框架分享

    HTML5框架可以快速构建响应式网站,它们帮助程序员减少编码工作,减少冗余的代码.如今有很多免费的HTML5框架可供使用,由于它们有着响应式设计.跨浏览器兼容.相对轻量级等特点,这些框架在开发中都十分 ...