zoukankan      html  css  js  c++  java
  • 洛谷P1129 [ZJOI2007]矩阵游戏(二分图匹配)

    ### 题目链接 ###

    题目大意:
    给定一个 具有 (0)(1)(N×N) 的矩阵,可以随意地交换任意两行,或者交换任意两列。问能否使得矩阵的主对角线上全是 (1)

    分析:
    1、对于一个存在于 ((i,j))(1) ,无论怎样交换这个 (1) 的行,或者交换列,最后的结果一定是,原本存在于该行的元素一定还在该行(只是顺序不同),原本存在于该列上的元素一定还在该列(只是顺序不同)。

    2、回到题目,要求主对角线上都是 (1),那么比如已经在 ((1,1)) 放上一个 (1) 了,那么第一行与第一列上的 (1) 就不可能再通过任何行列变换到其它对角线上。总而言之,对于一个 (1) ,如果它放在一个对角线上做贡献,那么它所在行与所在列上的 (1) 都不可能再做贡献。

    3、进而本题就很容易的转化成,求该图上所有的 (1),行不同且列不同的最多能有多少个,能达到 (n) 个即可 (Yes)

    代码如下:

    #include<set>
    #include<map>
    #include<queue>
    #include<stack>
    #include<cmath>
    #include<vector>
    #include<string>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define pb push_back
    #define first fi
    #define second se
    #define IO std::ios::sync_with_stdio(false)
    typedef long long ll;
    const int maxn = 100008;
    const ll mod = 1e9+7;
    const int inf = 0x3f3f3f3f;
    const ll INF = 1e18 + 10;
    const double eps = 1e-6;
    using namespace std;
    int T,n;
    int cnt,head[maxn],cx[maxn];
    bool vis[maxn];
    struct Edge{
    	int to;
    	int next;
    }edge[maxn<<2];
    inline void add(int u,int v){
    	edge[++cnt].to=v;
    	edge[cnt].next=head[u];
    	head[u]=cnt;
    	return;
    }
    int dfs(int u){
    	for(int i=head[u];i;i=edge[i].next){
    		int v=edge[i].to;
    		if(!vis[v]){
    			vis[v]=true;
    			if(cx[v]==0||dfs(cx[v])){
    				cx[v]=u;
    				return 1;
    			}
    		}
    	}
    	return 0;
    }
    int main()
    {
    	scanf("%d",&T);
    	while(T--){
    		scanf("%d",&n);
    		cnt=0;
    		memset(head,0,sizeof(head));
    		memset(cx,0,sizeof(cx));
    		int x;
    		for(int i=1;i<=n;i++){
    			for(int j=1;j<=n;j++){
    				scanf("%d",&x);
    				if(x) add(i,j);
    			}
    		}
    		int ans=0;
    		for(int i=1;i<=n;i++){
    			memset(vis,0,sizeof(vis));
    			ans+=dfs(i);
    		}
    		if(ans>=n) printf("Yes
    ");
    		else printf("No
    ");
    	}
    }
    
  • 相关阅读:
    关于sublimeText3 设置格式化代码快捷键的问题
    前端网站收集汇总(持续更新)
    vue 插件(Sublime Text 3 常用插件以及安装方法)(转)
    关于实时监测网络每秒上下行流量问题
    Github上的iOS App源码 (中文)
    Mac上安装第三方应用显示包资源破坏解决办法
    vue开发环境搭建Mac版
    iOS跳转支付宝付款码和扫一扫页面
    深入出不来nodejs源码-timer模块(JS篇)
    深入出不来nodejs源码-events模块
  • 原文地址:https://www.cnblogs.com/Absofuckinglutely/p/12461474.html
Copyright © 2011-2022 走看看