#匈牙利算法#洛谷 1129 codevs 1433 矩阵游戏

题目

一个 n × n n\times n n×n黑白方阵,每次可以对该矩阵进行两种操作:
行交换操作:选择矩阵的任意两行,交换这两行(即交换对应格子的颜色)
列交换操作:选择矩阵的任意两列,交换这两列(即交换对应格子的颜色)
游戏的目标,即通过若干次操作,使得方阵的主对角线(左上角到右下角的连线)上的格子均为黑色。
问是否有解


分析

可以发现无论怎么交换,二分图匹配的答案是不变的,所以说跑一遍匈牙利算法,如果每行每列都能匹配,那么即为有解


代码

#include <cstdio>
#include <cstring>
bool a[501][501],v[501]; int n,link[501];
int in(){
	int ans=0; char c=getchar();
	while (c<48||c>57) c=getchar();
	while (c>47&&c<58) ans=ans*10+c-48,c=getchar();
	return ans;
}
bool dfs(int x){//匈牙利算法
	for (register int i=1;i<=n;i++)
	if (a[x][i]&&!v[i]){
		v[i]=1; int q=link[i];
		link[i]=x;//记录路径
		if (!q||dfs(q)) return 1;
		link[i]=q;
	}
	return 0;
}
int main(){
	int t=in();
	while (t--){
		n=in(); int ans=0;
		memset(link,0,sizeof(link));
		for (register int i=1;i<=n;i++)
		for (register int j=1;j<=n;j++) a[i][j]=in();
		for (register int i=1;i<=n;i++)
			memset(v,0,sizeof(v)),ans+=dfs(i);
		if (ans==n) printf("Yes\n"); else printf("No\n");
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值