矩阵游戏|ZJOI2007|BZOJ1059|codevs1433|luoguP1129|二分图匹配|匈牙利算法|Elena

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个格子的横纵坐标是匹配的,这些格子的横纵坐标不会相同,就会组成一条线,我们可以把交换行列看成改变格子的位置,所以如果组成的是左下角到右上角的线,可以通过交换列来达到理想位置。那条线符合答案要求。因为我们可以通过换行换列来使格子到达该到的地方。可以通过交换行列来改变格子的位置,但是同行列的格子间会受到影响,所以只有不同行列的格子改变到理想的位置后不会影响到其他的格子。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstdlib>
 4 #include<cstring>
 5 #include<cmath>
 6 using namespace std;
 7 int read()
 8 {
 9     int x=0,f=1; char c=getchar();
10     while (c<‘0‘||c>‘9‘) {if (c==‘-‘) f=-1; c=getchar();}
11     while (c>=‘0‘&&c<=‘9‘) {x=x*10+c-‘0‘;c=getchar();}
12     return x*f;
13 }
14 int num_edge,head[500],T,sum,n,match[500];
15 bool book[500];
16 struct Edge
17 {
18     int next;
19     int to;
20 }edge[81000];
21 void add_edge(int from,int to)
22 {
23     edge[++num_edge].next=head[from];
24     edge[num_edge].to=to;
25     head[from]=num_edge;
26 }
27 bool dfs(int u)
28 {
29     for (int i=head[u]; i; i=edge[i].next)
30         if (book[edge[i].to]==0) {
31             book[edge[i].to]=1;
32             if (match[edge[i].to]==0||dfs(match[edge[i].to])) {
33                 match[edge[i].to]=u;
34                 match[u]=edge[i].to;
35                 return 1;
36             }
37         }
38     return 0;
39 }
40 int main()
41 {
42     T=read();
43     while (T--) {
44         bool p=1;
45         sum=0;
46         num_edge=0;
47         n=read();
48         memset(match,0,sizeof(match));
49         memset(head,0,sizeof(head));
50         for (int i=1; i<=n; i++)
51             for (int j=1; j<=n; j++) {
52                 int x=read();
53                 if (x==1) {
54                     add_edge(i,j+n);
55                     add_edge(j+n,i);
56                 }
57             }
58         for (int i=1; i<=n; i++) {
59             memset(book,0,sizeof(book));
60             book[i]=1;
61             if (!dfs(i)) {
62                 p=0;
63                 break;
64             }
65         }
66         if (p) puts("Yes"); else puts("No");
67     }
68     return 0;
69 }

矩阵游戏

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

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

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


Elena loves NiroBC forever!

时间: 2024-10-24 20:31:47

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

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

The Perfect StallHal Burch Farmer John completed his new barn just last week, complete with all the latest milking technology. Unfortunately, due to engineering problems, all the stalls in the new barn are different. For the first week, Farmer John r

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

Kingdom of Obsession Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 49    Accepted Submission(s): 14 Problem Description There is a kindom of obsession, so people in this kingdom do things very

HDU1507 Uncle Tom&#39;s Inherited Land* 二分图匹配 匈牙利算法 黑白染色

原文链接http://www.cnblogs.com/zhouzhendong/p/8254062.html 题目传送门 - HDU1507 题意概括 有一个n*m的棋盘,有些点是废的. 现在让你用1*2的矩形覆盖所有的不废的点,并且不重叠,问最多可以覆盖多少个1*2的矩形,输出方案,有SPJ. 输入描述: 多组数据,每组首先两个数n,m(如果n和m为0,则结束程序) 然后给出k 然后给出k个二元组(x,y)表示废点的坐标. 题解 按照前两片博文的算法已经不行了,因为方案不对了. 所以我们要进行

[SCOI2010][BZOJ1854] 游戏|二分图匹配|匈牙利算法|并查集

1854: [Scoi2010]游戏 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 3018  Solved: 1099[Submit][Status][Discuss] Description lxhgww最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有2个属性,这些属性的值用[1,10000]之间的数表示.当他使用某种装备时,他只能使用该装备的某一个属性.并且每种装备最多只能使用一次. 游戏进行到最后,lxhgww遇到了终极boss

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

题目背景 第二次世界大战时期.. 题目描述 英国皇家空军从沦陷国征募了大量外籍飞行员.由皇家空军派出的每一架飞机都需要配备在航行技能和语言上能互相配合的2 名飞行员,其中1 名是英国飞行员,另1名是外籍飞行员.在众多的飞行员中,每一名外籍飞行员都可以与其他若干名英国飞行员很好地配合.如何选择配对飞行的飞行员才能使一次派出最多的飞机.对于给定的外籍飞行员与英国飞行员的配合情况,试设计一个算法找出最佳飞行员配对方案,使皇家空军一次能派出最多的飞机. 对于给定的外籍飞行员与英国飞行员的配合情况,编程找

网络流24题 第一题 - 洛谷2756 飞行员配对方案 二分图匹配 匈牙利算法

欢迎访问~原文出处--博客园-zhouzhendong 去博客园看该题解 题目传送门 题意概括 裸的二分图匹配 题解 匈牙利算法 上板子 代码 #include <cstring> #include <cstdio> #include <algorithm> #include <cstdlib> #include <cmath> using namespace std; const int N=100+5; int m,n,a,b,match[N

图论-二分图匹配-匈牙利算法

有关概念: 二分图:图G中的点集可以分为两个互不相交的子集,且G中的每条边连接的两个点分别属于这两个子集 二分图匹配:二分图G的子图M中每个结点上只连一条边,则称M为一个匹配 极大匹配:无法再向二分图中加边且满足匹配条件的匹配 最大匹配:所有极大匹配中边数最多的一个 增广路:若P为图G上连接两个未匹配结点的路径,且已匹配边和未匹配边在P上交替出现,则称P为相对于M的一条增广路 匈牙利算法即用来求二分图的极大匹配 思路: 在图G中找出增广路P,对P上每一条边取反(即已匹配边改为未匹配边,未匹配边改

二分图匹配-匈牙利算法【学习】

首先二分图匹配的基础概念得清楚:二分图: 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B),则称图G为一个二分图.匹配: 两两不含公共端点的边集合M称为匹配(简单的说就是右边的点只能连一条边)极大匹配: 指在当前已完成的匹配下,无法再通过增加未完成匹配的边的方式来增加匹配的边数最大匹配: 所有极大匹配当中边数最大的一个匹配增广路: 若P是图G中一条连通两个未匹配顶

BZOJ 1191 [HNOI2006]超级英雄Hero:二分图匹配 匈牙利算法

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1191 题意: 有m道题,每答对一题才能接着回答下一个问题. 你一道题都不会,但是你有n个"锦囊妙计"(每个只能用一次). 对于每道题,你只能用该题规定的两种锦囊中的一种,来解决这道题. 问你最多能解决多少道题. 题解: 二分图最大匹配. 匈牙利算法. 问题与锦囊匹配. 最大匹配即为最多回答数. 但是题目中要求题目必须连续回答,不能中断. 所以在给每一个问题配对时,一旦匹配不上,