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

    这竟然是一道二分图

    乍一看,可能是用搜索做,但是这个数据范围,一定会T。
    我们观察发现,无论怎样变换,同一行的一定在同一行,同一列的一定还在同一列。所以说,一行只能配一列。这样,我们的目标就是寻找是否存在一种变换方式,使得行数与列数一一对应,且对应数为n。
    我们可以把行数和列数作为二分图的两部分,然后跑一个匈牙利

    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <cmath>
    using namespace std;
    int init(){
    	int rv=0,fh=1;
    	char c=getchar();
    	while(c<'0'||c>'9'){
    		if(c=='-') fh=-1;
    		c=getchar();
    	}
    	while(c>='0'&&c<='9'){
    		rv=(rv<<1)+(rv<<3)+c-'0';
    		c=getchar();
    	}
    	return rv*fh;
    }
    int T,n,g[205][205],match[205];
    bool f[205];
    bool hungarian(int u){
    	for(int i=1;i<=g[u][0];i++){
    		int v=g[u][i];
    		if(!f[v]){
    			f[v]=1;
    			if(!match[v]||hungarian(match[v])){
    				match[v]=u;
    				return 1;
    			}
    		}
    	}
    	return 0;
    }
    int main(){
    	T=init();
    	while(T--){
    		n=init();
    		memset(g,0,sizeof(g));
    		memset(match,0,sizeof(match));
    		for(int i=1;i<=n;i++){
    			for(int j=1;j<=n;j++){
    				int t=init();
    				if(t) g[i][++g[i][0]]=j;
    			}
    		}
    		int ans=0;
    		for(int i=1;i<=n;i++){
    			memset(f,0,sizeof(f));
    			if(hungarian(i)) ans++;
    		}
    		if(ans==n) printf("Yes
    ");
    		else printf("No
    ");
    	}
    	return 0;
    }
    
  • 相关阅读:
    MUTC2013 E-Deque-hdu 4604
    MUTC7 C
    MUTC7 A-As long as Binbin loves Sangsang
    MUTC2013 J-I-number-hdu4608
    MUTC2013 H-Park Visit-hdu4607
    判断点是否在多边形内 扫描法
    蓝桥杯 基础练习 十六进制转八进制
    判断点是否在三角形内
    判断点在线段上
    向量的叉乘
  • 原文地址:https://www.cnblogs.com/Mr-WolframsMgcBox/p/8252281.html
Copyright © 2011-2022 走看看