1059: [ZJOI2007]矩阵游戏

Time Limit: 10 Sec  Memory Limit: 162 MB

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

思路:这个题目表面上看叫人丝毫没有丝绸之路qwq可是网络流啊匈牙利算法啥的题目写多了被套路多了之后就会变得熟练_(:з」∠)_

题目中给我们的操作是可以交换任意两行和任意两列,我们可以确定同一行的两个格子永远在同一行,同一列的也是一样,同一行的两个格子永远不会跑到不同的两行里去,所以两个格子我们只能取一个来用,另外一个是没有作用的,不存在把这个格子放在这个对角线的一个地方,另一个格子放在对角线上的另一个地方。因为对角线上的格子横纵坐标都是不相同的。

题目中要求的形状是正对角线也就是从左上角到右下角的连线。我们可以把每一个1格子的横坐标和纵坐标连边,然后匈牙利算法找出二分图最大匹配,如果最大匹配数等于n,则答案是yes,反之则是no。

为什么最大匹配数为n就是yes呢?因为我们可以这么想:假设有一个3*3的矩阵,从左上角到右下角的连线经过的格子依次是(1,1),(2,2)和(3,3)这3个格子。假如这时候(1,2)也有一个1号格子,照我们前面的说法,把这些格子的横纵坐标依次连边。然后照二分图匹配的思想,如果(1,2)配对成功的话,就只能配对成(1,2)和(3,3)这两对了,也只取了这两个格子,无法组成连线,是不符合条件的,所以(1,2)不能配对,我们应该找最大匹配。

因为当最大匹配数等于n时,就说明正好有n个格子的横纵坐标是匹配的,这些格子的横纵坐标不会相同,就会组成一条线,我们可以把交换行列看成改变格子的位置,所以如果组成的是左下角到右上角的线,可以通过交换列来达到理想位置。那条线符合答案要求。因为我们可以通过换行换列来使格子到达该到的地方。可以通过交换行列来改变格子的位置,但是同行列的格子间会受到影响,所以只有不同行列的格子改变到理想的位置后不会影响到其他的格子。

 #include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
using namespace std;
int read()
{
int x=,f=; char c=getchar();
while (c<''||c>'') {if (c=='-') f=-; c=getchar();}
while (c>=''&&c<='') {x=x*+c-'';c=getchar();}
return x*f;
}
int num_edge,head[],T,sum,n,match[];
bool book[];
struct Edge
{
int next;
int to;
}edge[];
void add_edge(int from,int to)
{
edge[++num_edge].next=head[from];
edge[num_edge].to=to;
head[from]=num_edge;
}
bool dfs(int u)
{
for (int i=head[u]; i; i=edge[i].next)
if (book[edge[i].to]==) {
book[edge[i].to]=;
if (match[edge[i].to]==||dfs(match[edge[i].to])) {
match[edge[i].to]=u;
match[u]=edge[i].to;
return ;
}
}
return ;
}
int main()
{
T=read();
while (T--) {
bool p=;
sum=;
num_edge=;
n=read();
memset(match,,sizeof(match));
memset(head,,sizeof(head));
for (int i=; i<=n; i++)
for (int j=; j<=n; j++) {
int x=read();
if (x==) {
add_edge(i,j+n);
add_edge(j+n,i);
}
}
for (int i=; i<=n; i++) {
memset(book,,sizeof(book));
book[i]=;
if (!dfs(i)) {
p=;
break;
}
}
if (p) puts("Yes"); else puts("No");
}
return ;
}

矩阵游戏

注意:每一组数据开始时都要清空边表的num_edge和head数组。

注意:检查代码时就算是定义部分也要检查,别自以为是。

有问题可以直接在评论里面提问,有需要转载的请得到我的允许,否则按侵权处理。


Elena loves NiroBC forever!

矩阵游戏|ZJOI2007|BZOJ1059|codevs1433|luoguP1129|二分图匹配|匈牙利算法|Elena的更多相关文章

  1. HDU 5943 Kingdom of Obsession 【二分图匹配 匈牙利算法】 (2016年中国大学生程序设计竞赛(杭州))

    Kingdom of Obsession Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Oth ...

  2. USACO 4.2 The Perfect Stall(二分图匹配匈牙利算法)

    The Perfect StallHal Burch Farmer John completed his new barn just last week, complete with all the ...

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

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

  4. [bzoj]1059矩阵游戏<二分图匹配*匈牙利算法>

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1059 初见此题,我觉得这是水题,我认为只要每一行和每一列至少存在一个黑格就可以出现对角线, ...

  5. P2756 飞行员配对方案问题 二分图匹配 匈牙利算法

    题目背景 第二次世界大战时期.. 题目描述 英国皇家空军从沦陷国征募了大量外籍飞行员.由皇家空军派出的每一架飞机都需要配备在航行技能和语言上能互相配合的2 名飞行员,其中1 名是英国飞行员,另1名是外 ...

  6. HDU - 2819 Swap (二分图匹配-匈牙利算法)

    题意:一个N*N的01矩阵,行与行.列与列之间可以互换.要求变换出一个对角线元素全为1的矩阵,给出互换的行号或列号. 分析:首先一个矩阵若能构成对角线元素全为1,那么矩阵的秩为N,秩小于N的情况无解. ...

  7. Codevs 1222 信与信封问题 二分图匹配,匈牙利算法

    题目: http://codevs.cn/problem/1222/ 1222 信与信封问题   时间限制: 1 s   空间限制: 128000 KB   题目等级 : 钻石 Diamond 题解 ...

  8. BZOJ1433 [ZJOI2009]假期的宿舍 二分图匹配 匈牙利算法

    原文链接http://www.cnblogs.com/zhouzhendong/p/8372785.html 题目传送门 - BZOJ1433 题解 我们理一理题目. 在校的学生,有自己的床,还可以睡 ...

  9. HDU1507 Uncle Tom's Inherited Land* 二分图匹配 匈牙利算法 黑白染色

    原文链接http://www.cnblogs.com/zhouzhendong/p/8254062.html 题目传送门 - HDU1507 题意概括 有一个n*m的棋盘,有些点是废的. 现在让你用1 ...

随机推荐

  1. Duplicate复制数据库并创建物理StandBy(spfile+不同实例名+不同路径)

    过程和Duplicate复制数据库并创建物理StandBy类似,只是不需要重启数据库. 目的:创建standby,不重启源数据库 1设定环境如下: Primary数据库 IP 172.17.22.16 ...

  2. maven超级pom内容

    1.位置 2.内容 <?xml version="1.0" encoding="UTF-8"?> <!-- Licensed to the A ...

  3. JDK自带jvisualvm监控工具

    定位 工具位于jdk\bin目录下(双击运行): 可以本地或者远程调试,本地调试会自动加载,远程调试需要配置.下面以Tomcat为例. 概述 监视 线程 抽样器 Java 堆 百度经验参考:https ...

  4. WineBottler for Mac(Mac 运行 exe 程序工具)安装

    1.软件简介    WineBottler 是 macOS 系统上一款模拟 Windows 环境的工具,让你能够在 Mac 上安装 Windows 软件,类似于知名的 Crossover,但 Wine ...

  5. primary库新增数据文件后,standby库无法创建文件并终止数据同步

    主库是RAC环境,使用asm存放数据文件,备库是操作系统本地文件系统存放数据文件.在主库执行以下操作: SQL> alter tablespace ysdv add datafile '+dat ...

  6. jQuery Address全站 AJAX 完整案例详解

    本文详细介绍如何利用 jQuery 框架以及 jQuery Address 插件实现最基本的全站 AJAX 动态加载页面内容的功能的方法. 案例目标 以常见基本结构的网站为案例,实现全站链接 AJAX ...

  7. Appium 输入 & 符号,实际输入&-

    2018-10-11 12:27:12:178 - [debug] [MJSONWP] Calling AppiumDriver.setValue() with args: [["& ...

  8. 【iCore4 双核心板_ARM】例程七:WWDG看门狗实验——复位ARM

    实验原理: STM32内部包含窗口看门狗,通过看门狗可以监控程序运行,程序运行错误时,未在 规定时间喂狗(提前或超时),自动复位ARM,本实验通过按键按下,停止喂狗,从而产 生复位. 核心代码: in ...

  9. 【GMT43智能液晶模块】例程二:串口通信实验

    实验原理: GMT43智能液晶模块的串口包括USB_UART(CH340),TTL,RS-232,RS-485/ RS-422等四部分,USB_UART部分通过CH340芯片与STM32F429的US ...

  10. error C3861: “xxxx”: 找不到标识符

    问题出现背景:c++静态类库中主函数里包含子函数 解决办法:先声明子函数再写主函数.