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. 钉钉机器人集成Jenkins推送消息模板自定义发送报告

    一.由于公司同样也使用了钉钉.那么在做Jenkins集成自动化部署的时候,也是可以集成钉钉的. 那种Jenkins下载钉钉插件集成,简单设置就可以完成了.我们今天要做的是,定制化的发送消息. 钉钉推送 ...

  2. [原创] Trie树 php 实现敏感词过滤

    目录 背景 简介 存储结构 PHP 其他语言 字符串分割 示例代码 php 优化 缓存字典树 常驻服务 参考文章 背景 项目中需要过滤用户发送的聊天文本, 由于敏感词有将近2W条, 如果用 str_r ...

  3. Java 语言结构【转】

    Java 语言结构 基础:包(Package).类(Class)和对象(Object) 了解 Java 的包(Package).类(Class)和对象(Object)这些基础术语是非常重要的,这部分内 ...

  4. 微信 oauth 登录 ,回调两次,一个坑,记录一下。

    在做微信某个功能的时候,大致需求是:静默授权,得到openId ,然后拿着openId调用接口,判断是否关注.如果是关注的,则发放礼券.每个我网站的会员只会发放一次礼券.如果第二次则会提示已领取过礼券 ...

  5. OpenERP how to set the tree view limit

    return { 'name':u'库存报表', 'view_type':'form', 'view_mode':'tree,form', 'res_model':'rainsoft.account. ...

  6. WCF系列教程之WCF服务宿主与WCF服务部署

    本文参考自http://www.cnblogs.com/wangweimutou/p/4377062.html,纯属读书笔记,加深记忆. 一.简介 任何一个程序的运行都需要依赖一个确定的进程中,WCF ...

  7. jQuery多库共存问题解决方法

    一.问题概述: 1.随着jQuery的流行,采用jQuery和$符为命名空间的js库越来越多,当然jQuery的$符也是参照的Prototype库的,所以当多个库同时以$符或者jQuery为命名空间时 ...

  8. LeetCode-2. Add Two Numbers(链表实现数字相加)

    1.题目描述 You are given two non-empty linked lists representing two non-negative integers. The digits a ...

  9. linux 和 windows 安装composer

    在 Linux 和 Mac OS X 中可以运行如下命令: curl -sS https://getcomposer.org/installer | phpmv composer.phar /usr/ ...

  10. 用table布局和div布局的区别

    table布局的渲染是将整个table全部渲染出来,如果网路不给力的情况下,整个table会卡死在页面div布局的话,页面渲染,会一个一个的div渲染,网页出现会一个一个出来,不管网速怎样,不会全局卡 ...