• BZOJ1059: [ZJOI2007]矩阵游戏


    BZOJ1059: [ZJOI2007]矩阵游戏

    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
    题解Here!

    多组数据的二分图最大匹配。

    我们把点看成匹配边的话,就是每行和每列都做到了匹配。

    换言之就是N个行和N个列都有匹配时,一定能转换成最终状态。

    所以就如S向每行所对应的点连边,每列所对应的点向T连边。

    每个1的块就是某行和某列的边。

    再逆过来转换到初始状态,我们发现交换行本质就是交换S向这两行连的边,所以匹配数不变。

    同理交换列也是。

    于是就可以跑匈牙利了。

    当且仅当匹配数为N时有解。

    注意清零。。。

    附代码:

    #include<iostream>
    #include<algorithm>
    #include<cstdio>
    #include<cstring>
    #define MAXN 210
    using namespace std;
    int n,m,ans,f[MAXN],a[MAXN][MAXN];
    bool vis[MAXN];
    inline int read(){
    	int date=0,w=1;char c=0;
    	while(c<'0'||c>'9'){if(c=='-')w=-1;c=getchar();}
    	while(c>='0'&&c<='9'){date=date*10+c-'0';c=getchar();}
    	return date*w;
    }
    bool find(int x){
    	for(int i=1;i<=n;i++)
    	if(!vis[i]&&a[x][i]){
    		vis[i]=true;
    		if(f[i]==-1||find(f[i])){
    			f[i]=x;
    			return true;
    		}
    	}
    	return false;
    }
    void work(){
    	int x,y;
    	for(int i=1;i<=n;i++)
    	for(int j=1;j<=n;j++)
    	a[i][j]=read();
    	for(int i=1;i<=n;i++){
    		memset(vis,false,sizeof(vis));
    		if(find(i))
    		ans++;
    	}
    	if(ans==n)printf("Yes
    ");
    	else printf("No
    ");
    }
    int main(){
    	int t;
    	t=read();
    	while(t--){
    		n=read();
    		ans=0;
    		memset(a,false,sizeof(a));
    		memset(f,-1,sizeof(f));
    		memset(vis,false,sizeof(vis));
    		work();
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    ios15--综合小例子
    ios ionic 装平台 笔记
    ios14--购物车优化2
    ios13--购物车优化
    ios--plist
    ios12--简易购物车
    ios11--UIButton
    Android Json的使用(2) 使用Jackson解析和生成json
    快速Android开发系列网络篇之Retrofit
    关于XUtils框架细解
  • 原文地址:https://www.cnblogs.com/Yangrui-Blog/p/9373832.html
Copyright © 2020-2023  润新知