P1129 [ZJOI2007]矩阵游戏

题目描述

小\(Q\)是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏――矩阵游戏。矩阵游戏在一个\(N*N\)黑白方阵进行(如同国际象棋一般,只是颜色是随意的)。每次可以对该矩阵进行两种操作:

行交换操作:选择矩阵的任意两行,交换这两行(即交换对应格子的颜色)

列交换操作:选择矩阵的任意两列,交换这两列(即交换对应格子的颜色)

游戏的目标,即通过若干次操作,使得方阵的主对角线(左上角到右下角的连线)上的格子均为黑色。

对于某些关卡,小\(Q\)百思不得其解,以致他开始怀疑这些关卡是不是根本就是无解的!!于是小\(Q\)决定写一个程序来判断这些关卡是否有解。

输入输出格式

输入格式:

第一行包含一个整数\(T\),表示数据的组数。

接下来包含\(T\)组数据,每组数据第一行为一个整数\(N\),表示方阵的大小;接下来\(N\)行为一个\(N*N\)的\(01\)矩阵(\(0\)表示白色,\(1\)表示黑色)。

输出格式:

包含\(T\)行。对于每一组数据,如果该关卡有解,输出一行\(Yes\);否则输出一行\(No\)。

说明

对于\(20\)%的数据,\(N ≤ 7\)

对于\(50\)%的数据,\(N ≤ 50\)

对于\(100\)%的数据,\(N ≤ 200\)


研究一下操作和要求,我们可以这么转化:每行至少有一个\(1\)并且这些\(1\)互相不在同一列

对于行\(i\),我们用了坐标\((i,j)\)的\(1\),那么第\(j\)列的\(1\)不就废了吗?

好的,求匹配。

坐标为\((i,j)\)的点作为第\(i\)行第\(j\)列的边。

求每一行和每一列的最大匹配数即可。

二分图匹配。


code:

#include <cstdio>
#include <cstring>
const int N=202;
struct Edge
{
    int to,next;
}g[N*N];
int T,head[N],cnt=0,n;

void add(int u,int v)
{
    g[++cnt].to=v,g[cnt].next=head[u],head[u]=cnt;
}
int match[N],used[N];
bool m_match(int now)
{
    for(int i=head[now];i;i=g[i].next)
    {
        int v=g[i].to;
        if(!used[v])
        {
            used[v]=1;
            if(!match[v]||m_match(match[v]))
            {
                match[v]=now;
                return true;
            }
        }
    }
    return false;
}

int main()
{
    scanf("%d",&T);
    int is;
    while(T--)
    {
        memset(match,0,sizeof(match));
        memset(head,0,sizeof(head));
        scanf("%d",&n);cnt=0;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
            {
                scanf("%d",&is);
                if(is) add(i,j);
            }
        int ans=0;
        for(int i=1;i<=n;i++)
        {
            memset(used,0,sizeof(used));
            if(m_match(i)) ans++;
        }
        if(ans==n) printf("Yes\n");
        else printf("No\n");
    }
}

我的一些出现的细节错误:

  1. 匈牙利used数组置true时机(似乎经常错)
  2. used置0的时机(在if的外面)
  3. 前向星head,cnt置0

2018.5.5

洛谷 P1129 解题报告的更多相关文章

  1. 洛谷 P1462 解题报告

    P1462 通往奥格瑞玛的道路 题目背景 在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主城暴风城 在被众多联盟的士兵攻击后,他决定逃回自己的家乡 ...

  2. 洛谷 P1879 解题报告

    P1879 [USACO06NOV]玉米田Corn Fields 题目描述 农场主\(John\)新买了一块长方形的新牧场,这块牧场被划分成\(M\)行\(N\)列\((1 ≤ M ≤ 12; 1 ≤ ...

  3. 洛谷 P1069 解题报告

    P1069 细胞分裂 题目描述 \(Hanks\)博士是\(BT\) (\(Bio-Tech\),生物技术) 领域的知名专家.现在,他正在为一个细胞实验做准备工作:培养细胞样本. \(Hanks\) ...

  4. 洛谷 P2491 解题报告

    P2491 消防 题目描述 某个国家有n个城市,这n个城市中任意两个都连通且有唯一一条路径,每条连通两个城市的道路的长度为zi(zi<=1000). 这个国家的人对火焰有超越宇宙的热情,所以这个 ...

  5. 洛谷 P2587 解题报告

    P2587 [ZJOI2008]泡泡堂 题目描述 第XXXX届NOI期间,为了加强各省选手之间的交流,组委会决定组织一场省际电子竞技大赛,每一个省的代表队由n名选手组成,比赛的项目是老少咸宜的网络游戏 ...

  6. 洛谷 P1054 解题报告

    P1054 等价表达式 题目描述 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的 ...

  7. 洛谷 P1053 解题报告

    P1053 篝火晚会 题目描述 佳佳刚进高中,在军训的时候,由于佳佳吃苦耐劳,很快得到了教官的赏识,成为了"小教官".在军训结束的那天晚上,佳佳被命令组织同学们进行篝火晚会.一共有 ...

  8. 洛谷 P1057 解题报告

    P1057 传球游戏 题目描述 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次,老师带着同学们一起做传球游戏. 游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹 ...

  9. 洛谷 P1430 解题报告

    P1430 序列取数 题目描述 给定一个长为\(n\)的整数序列\((n<=1000)\),由\(A\)和\(B\)轮流取数(\(A\)先取).每个人可从序列的左端或右端取若干个数(至少一个), ...

随机推荐

  1. Git的纯命令操作,Install,Clone , Commit,Push,Pull,版本回退,撤销更新,分支的创建/切换/更新/提交/合并,代码冲突

    Git的纯命令操作,Install,Clone , Commit,Push,Pull,版本回退,撤销更新,分支的创建/切换/更新/提交/合并,代码冲突 这篇是接着上篇分布式版本库--Windows下G ...

  2. Leetcode_96_Unique Binary Search Trees

    本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/43198929 Given n, how many stru ...

  3. RHEL6从源码安装python及其他软件包

    RHEL6从源码安装python及其他软件包 ## install ssl $ sudo yum install openssl-devel or: $ sudo apt-get install li ...

  4. DataLoad命令

    Dataload常用命令 Dataload命令符 说明 Tab  或\{tab} 键盘Tab键,下一个单元 *UP  或\{UP} 键盘上 *DN  或\{DOWN} 键盘下 *LT  或\{LEFT ...

  5. Testbench(转)

    本来还打算自己写下对Testbench的理解,后来发现百度百科名片解释得很好,所以就直接转了. 原文百度百科链接:http://baike.baidu.com/link?url=dxzsOAs32IE ...

  6. C语言之可变参实现scanf函数

    既然有printf函数可变参实现,那就一定有scanf函数的可变参实现.废话不多说,源码奉上: 本源码不过多分析,如要明白原理,请翻本博客以往的文章看说明. 欢迎关注新浪微博:http://weibo ...

  7. java解决hash算法冲突

    看了ConcurrentHashMap的实现, 使用的是拉链法. 虽然我们不希望发生冲突,但实际上发生冲突的可能性仍是存在的.当关键字值域远大于哈希表的长度,而且事先并不知道关键字的具体取值时.冲突就 ...

  8. 初探linux子系统集之led子系统(三)

    世界杯结束了,德国战车夺得了大力神杯,阿根廷最终还是失败了.也许3年,5年,或者10年后,人们就不知道巴西世界杯的亚军是谁,但是总是会记得冠军是谁.就像什么考试,比赛,第一永远会被人们所记住,所以我们 ...

  9. 一个你不能错过的第三方.net集合库

    今天查找资料的时候,偶然发现了一个第三方的面向.net的集合类库,相比较FCL中的集合类,此第三方集合类库更全,最基本的Set数据结构在FCL里面是没有的,但是这个类库里面有,而且此类库的作者就是&l ...

  10. section元素与div、article元素的区别

    section元素是对网站或应用程序中页面上的内容进行分块,一个section元素通常有标题和内容组成.但section元素并非一个普通的容器元素,当一个容器需要直接定义样式或通过脚本定义行为时,推荐 ...