zoukankan      html  css  js  c++  java
  • [ZJOI2007]矩阵游戏

    题目

    bzoj1059

    题解

    可以发现,交换操作并不能改变点间的行列关系,所以只需要判断是否存在n个既不同行也不同列的点

    将行和列看做左右集合的点,若为黑色,则连上一条边,最后二分图最大匹配

    代码

    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <algorithm>
    #include <cmath> 
    #define N 205
    using namespace std;
    
    int t,n,lk[N];//lk记录左右集合的连接关系 
    bool mp[N][N],f[N];
    
    bool dfs(int x)//x行 
    {
    	for(int i=1;i<=n;i++)//i列 
    	{
    		if(mp[x][i]&&!f[i])//有边相连且i还未被连接 
    		{
    			f[i]=1;
    			if(!lk[i]||dfs(lk[i]))//若没有被连过或可更改连接 
    			{
    				lk[i]=x;
    				return true;
    			}
    		}
    	}
    	return false;
    }
    
    int main()
    {
    	scanf("%d",&t);
    	while(t--)
    	{
    		memset(f,0,sizeof(f));memset(lk,0,sizeof(lk));
    		scanf("%d",&n);
    		for(int i=1;i<=n;i++)
    			for(int j=1;j<=n;j++) scanf("%d",&mp[i][j]);
    		bool mark=0;
    		for(int i=1;i<=n;i++)
    		{
    			if(mark) continue;
    			memset(f,0,sizeof(f));
    			if(!dfs(i)) printf("No
    "),mark=1;
    		}
    		if(!mark) printf("Yes
    "); 
    	}
    	return 0;
    }
  • 相关阅读:
    基本数据结构:链表(list)
    字符串函数
    TCHAR
    开源库链接
    视频 链接
    tabbar
    加密
    安全类链接,https
    资本
    审核 -链接 - 发布证书
  • 原文地址:https://www.cnblogs.com/XYZinc/p/7623661.html
Copyright © 2011-2022 走看看