BZOJ 1059 & 二分图匹配

题意:

  判断一个黑白染色的棋盘能否通过交换行或列使对角线上都是黑色.

SOL:

  真是有点醉...这种问题要么很神要么很水...第一眼感觉很水但就是不造怎么做...想了10分钟怎么感觉就是判断个数够不够n呢然后就蹦出了一个反例...然后就忍不了百度= =...

  二分图匹配真是瞎了眼...然后发现好神又好水...

  显然的同一行无论怎么交换都是同一行---->根本就没往这上面想...同一列永远都是同一列,那么只要判断有多少不同行又不同列的就好了...枚举有点虚,那么就匹配吧!按照行列建图,恩就是这样...

Code:

  头文件都不要了= =

int head[maxn],now,point[maxm],next[maxm],match[maxn];
bool visit[maxn];
void add(int x,int y)
{
    next[++now]=head[x];
    head[x]=now;
    point[now]=y;
}
int dfs(int k)
{
    for(int i=head[k];i;i=next[i])if(!visit[point[i]])
    {
        int u=point[i];
        visit[u]=1;
        if(match[u]==-1||dfs(match[u]))
        {
            match[u]=k;
            return 1;
        }
    }
    return 0;
}
int main()
{
    int t,n,x;
    scanf("%d",&t);
    while(t--)
    {
        now=0;
        memset(head,0,sizeof(head));
        int flag=0;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
            {
                scanf("%d",&x);
                if(x==1)add(i,j);
            }
        memset(match,-1,sizeof(match));
        for(int i=1;i<=n;i++)
        {
            memset(visit,0,sizeof(visit));
            if(!dfs(i))
            {
                printf("No\n");
                flag=1;break;
            }
        }
        if(flag==0)printf("Yes\n");
    }
    return 0;
}
时间: 2024-10-21 06:27:10

BZOJ 1059 & 二分图匹配的相关文章

BZOJ 1059 矩阵游戏(神奇的二分图匹配)

题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1059 题意:给出一个N*N的01矩阵.有两种操作:(1)交换任意两行:(2)交换任意两列.问最后能否使得主对角线上全部为1? 思路:我们发现,对于同一行的两个1,比如 (i,j)和(i,j+1),无论如何我们也不能把这两个1都移动到主对角线上,换句话说,最多能够将其中一个1移动到主对角线上.因为,若我们想将这两 个同时移动到主对角线上,不妨设为(i1,i1),(i2,i2).首先,我们

bzoj 1059: [ZJOI2007]矩阵游戏 二分图匹配

1059: [ZJOI2007]矩阵游戏 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1891  Solved: 919[Submit][Status] Description 小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏——矩阵游戏.矩阵游戏在一个N*N黑白方阵进行(如同国际象棋一般,只是颜色是随意的).每次可以对该矩阵进行两种操作:行交换操作:选择矩阵的任意两行,交换这两行(即交换对应格子的颜色)列交换操作:选择矩阵

BZOJ 1059 [ZJOI2007]矩阵游戏:二分图匹配

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1059 题意: 给你一个n*n的01矩阵. 你可以任意次地交换某两行或某两列. 问你是否可以让这个矩阵的主对角线(左上角到右下角的连线)上的格子均为黑色. 题解: 可以发现,对于一个格子,无论怎样移动,它原来行(列)上的格子还是在现在的行(列)上. 因为最终目标是将n个黑色格子移到对角线上,所以只要有n个黑色格子的行列均不相同即可. 那么对于每个黑色格子,将行号i向列号j连一条边,然后跑二

BZOJ 1854 游戏(二分图匹配或并查集)

此题的二分图匹配做法很容易想,就是把属性当做s集,武器当做t集,如果该武器拥有该武器则连一条边. 那么答案就是求该二分图的最大前i个匹配.将匈牙利算法改一改,当前找不到增广路就break. 但是过这个题需要常数优化,不能每次都fillchar一遍used数组.可以用队列将使用的used点加入,然后需要初始化的时候弹出即可. # include <cstdio> # include <cstring> # include <cstdlib> # include <i

BZOJ 1191: [HNOI2006]超级英雄Hero(二分图匹配)

云神说他二分图匹配从来都是用网络流水过去的...我要发扬他的精神.. 这道题明显是二分图匹配.网络流的话可以二分答案+最大流.虽然跑得很慢.... ---------------------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> #include<iostrea

BZOJ 4443 [Scoi2015]小凸玩矩阵(二分答案+二分图匹配)

[题目链接]http://www.lydsy.com/JudgeOnline/problem.php?id=4443 [题目大意] 从矩阵中选出N个数,其中任意两个数字不能在同一行或同一列 求选出来的N个数中第K大的数字的最小值是多少. [题解] 我们二分这个第k大数字的大小,将其以上的数字全部删除, 在剩余的部分按行列连边,如果二分图匹配的数量大于n-k那么说明该答案可行. [代码] #include <cstdio> #include <algorithm> #include

Bzoj 1562: [NOI2009]变换序列 匈牙利算法,二分图匹配

题目: http://cojs.tk/cogs/problem/problem.php?pid=409 409. [NOI2009]变换序列 ★★☆   输入文件:transform.in   输出文件:transform.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述] 对于N个整数0, 1, ……, N-1,一个变换序列T可以将i变成Ti,其中 定义x和y之间的距离.给定每个i和Ti之间的距离D(i,Ti), 你需要求出一个满足要求的变换序列T.如果有多个满足条

BZOJ 1433 假期的宿舍 二分图匹配

这道题目不难,二分图匹配建模比较明显.加油吧!相信自己.(自己写的,好开心,40毫秒,比ccz略快). 尽管算法模版是抄一本书上的,但这次很明显我是背出来的.不算抄. 1 #include<cstdio> 2 #include<iostream> 3 #include<vector> 4 #include<queue> 5 #include<cstring> 6 #define rep(i,j,k) for(int i = j; i <=

BZOJ.3140.[HNOI2013]消毒(二分图匹配 匈牙利)

题目链接 不难想到每次一定是切一片. 如果是平面,很容易想到直接做二分图匹配.对于3维的? 可以发现min(a,b,c)的最大值只有\(\sqrt[3]{n}≈17\),我们暴力枚举这一最小值代表的是否选,对于剩下的两维二分图匹配 能用匈牙利用什么网络流啊..那么麻烦. 在匈牙利求解的过程中记得剪枝! 因为实际点数应该远不如ABC多,所以不要用memset,直接枚举. woc卡着时过去 那些2000ms怎么过的??网上找不到快点的懒得找. zz的我考场写的每次DFS完重建边+ISAP,成功都T掉