zoukankan      html  css  js  c++  java
  • [提高组集训2021] 粉刷匠

    题目描述

    (zxy) 要刷题,现在有一片 (n imes m) 的矩阵题库,每个格子对应一道题,他想把一些题刷 ( t Wa),另一些题刷 ( t Tle),每次可以选一整行或者一整列刷题。初始时每道题都没有提交,提交记录会覆盖,问达到目标刷题状态的最小步数,无解输出 (-1)

    (n,mleq3000)

    解法1

    考虑图论,每行每列的点拆成刷红或者刷蓝,代表选取的不同方案,我们把决策建在了点上,考虑把限制建在边上。也就是如果 ((i,j)) 是蓝色,那么点 (row(i,R)) 连向 (col(j,B)),点 (col(j,R)) 连向 (row(i,B)),这里的边代表刷了起点就必须刷终点,((i,j)) 为红色的情况同理。

    无解的情况是出现环,如果没有无解,考虑如果刷一个点那么管辖范围内的点都要刷,可以按照拓扑序来刷,那么每个点最多刷一次就足以解决限制。这说明了答案的上界是 (n+m)(如果是某个点的刷红连向了刷蓝,那么一定选刷蓝,因为刷红是完全无效的!),现在要刷满行或者刷满列才行,考试时我在图上决策,发现根本做不动!

    这时候要回到原图了!考虑刷满行的情况,每行都要刷红或者刷蓝,如果某个列和行决策颜色对应相同,那么就不需要染色了,否则一定需要染色。那么我们把每个列 ( t hash) 一下,找到数量最大的列的种类,设数量是 (x),可以通过设置行的决策来让这些列都不选,那么答案就是 (n+m-x),并且根据图论我们知道这样做合法且最优。对于刷满列的情况同理,把行 ( t hash) 一下即可,时间复杂度 (O(nm))

    解法2

    最后一步刷的一定是整行整列颜色相同的,可以根据这个性质去倒推,留给读者思考吧

    总结

    复杂的问题可以考虑图论,但是不要被图所困住了,原问题对于图论是及其重要的。

  • 相关阅读:
    操作MS SQL Server 存储过程的类(外加ASP.NET MessageBox类)
    利用DataGrid的超级联接传值
    操作数据库系统信息
    鼠标指向表格中的一行时,该行背景色改变;点击行时,突出显示标记颜色
    asp.net下的UBB代码[C#]
    java 为什么要序列化
    oracle调用java方法的例子(下面所有代码都是在sql/plus
    oracle存储过程
    一个Java程序员应该掌握的10项技能
    七款天气预报代码
  • 原文地址:https://www.cnblogs.com/C202044zxy/p/14934710.html
Copyright © 2011-2022 走看看