题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1059

题意:

  给你一个n*n的01矩阵。

  你可以任意次地交换某两行或某两列。

  问你是否可以让这个矩阵的主对角线(左上角到右下角的连线)上的格子均为黑色。

题解:

  可以发现,对于一个格子,无论怎样移动,它原来行(列)上的格子还是在现在的行(列)上。

  因为最终目标是将n个黑色格子移到对角线上,所以只要有n个黑色格子的行列均不相同即可。

  那么对于每个黑色格子,将行号i向列号j连一条边,然后跑二分图匹配,看匹配数是否等于n即可。

AC Code:

 #include <iostream>
#include <stdio.h>
#include <string.h>
#include <vector>
#define MAX_N 205 using namespace std; int n,t;
int vis[MAX_N];
int match[MAX_N];
vector<int> edge[MAX_N]; void read()
{
cin>>n;
for(int i=;i<=n;i++) edge[i].clear();
int x;
for(int i=;i<=n;i++)
{
for(int j=;j<=n;j++)
{
cin>>x;
if(x) edge[i].push_back(j);
}
}
} bool hungary(int now,int cnt)
{
for(int i=;i<edge[now].size();i++)
{
int temp=edge[now][i];
if(vis[temp]!=cnt)
{
vis[temp]=cnt;
if(match[temp]==- || hungary(match[temp],cnt))
{
match[temp]=now;
return true;
}
}
}
return false;
} void work()
{
memset(vis,,sizeof(vis));
memset(match,-,sizeof(match));
for(int i=;i<=n;i++)
{
if(!hungary(i,i))
{
cout<<"No"<<endl;
return;
}
}
cout<<"Yes"<<endl;
} int main()
{
cin>>t;
while(t--)
{
read();
work();
}
}

最新文章

  1. mysql导入导出,及错误记录
  2. windbg 基础命令实战 - 简单程序破解
  3. java:如何用代码控制H2 Database启动
  4. 【项目】iOS - 使用UIWebView占用内存过大
  5. Uc爆破工具
  6. BZOJ3787 : Gty的文艺妹子序列
  7. Using Amazon API Gateway with microservices deployed on Amazon ECS
  8. 一键生成HTML4和WAP站
  9. Java可视化编程,基于布局管理器的UI设计
  10. XML实例文档
  11. python 小白(无编程基础,无计算机基础)的开发之路 day2
  12. 深入理解计算机系统_3e 第五章家庭作业 CS:APP3e chapter 5 homework
  13. ansible实践2-拷贝文件或目录
  14. 解决RSA加密中,System.Security.Cryptography.CryptographicException: 系统找不到指定的文件
  15. Day044--javascript, ECMAScript
  16. @ReponseBody返回的json中文乱码-遁地龙卷风
  17. 使用md5加密算法完成简单的登录和注册功能
  18. Mac 电脑设置显示路径
  19. python中base64编码与解码
  20. ulimit限制打开的文件数量

热门文章

  1. java中双向链表的增、删、查操作
  2. 大型网站技术学习-2. 云计算之OpenStack简述
  3. 天兔插件监控mysql
  4. Tomcat startup.bat启动隐藏弹出的信息窗口
  5. 反应器模式 vs 生产者消费者模式
  6. VS2017下编译iconv
  7. 洛谷 P3216 [HNOI2011]数学作业
  8. 【学员管理系统】0x02 学生信息管理功能
  9. 我的Android进阶之旅------>FastJson的简介
  10. linux c编程:文件夹操作