BZOJ 1059 [ZJOI2007]矩阵游戏:二分图匹配
2024-08-21 05:39:24
题目链接: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();
}
}
最新文章
- mysql导入导出,及错误记录
- windbg 基础命令实战 - 简单程序破解
- java:如何用代码控制H2 Database启动
- 【项目】iOS - 使用UIWebView占用内存过大
- Uc爆破工具
- BZOJ3787 : Gty的文艺妹子序列
- Using Amazon API Gateway with microservices deployed on Amazon ECS
- 一键生成HTML4和WAP站
- Java可视化编程,基于布局管理器的UI设计
- XML实例文档
- python 小白(无编程基础,无计算机基础)的开发之路 day2
- 深入理解计算机系统_3e 第五章家庭作业 CS:APP3e chapter 5 homework
- ansible实践2-拷贝文件或目录
- 解决RSA加密中,System.Security.Cryptography.CryptographicException: 系统找不到指定的文件
- Day044--javascript, ECMAScript
- @ReponseBody返回的json中文乱码-遁地龙卷风
- 使用md5加密算法完成简单的登录和注册功能
- Mac 电脑设置显示路径
- python中base64编码与解码
- ulimit限制打开的文件数量