zoukankan      html  css  js  c++  java
  • 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
    ");
                    flag=1;break;
                }
            }
            if(flag==0)printf("Yes
    ");
        }
        return 0;
    }
    
    Sometimes it s the very people who no one imagines anything of. who do the things that no one can imagine.
  • 相关阅读:
    第42天:焦点图
    第41天:匀速、缓动运动和图片无缝滚动
    第40天:字符串操作:截取字符串
    MyBatis一级缓存(转载)
    Mycat 做简单的读写分离(转载)
    ui设计的好网站(转载)
    Java面试常问的问题(转载)
    ios学习的博客地址
    策略模式
    dubbo框架的简单介绍
  • 原文地址:https://www.cnblogs.com/YCuangWhen/p/5267032.html
Copyright © 2011-2022 走看看