UVA663 Sorting Slides(烦人的幻灯片)

Randolph68706 2019-07-22 原文

UVA663 Sorting Slides(烦人的幻灯片)

UVA663 Sorting Slides(烦人的幻灯片)

第一次做到这么玄学的题,在《信息学奥赛一本通》拓扑排序一章找到这个习题(却发现标程都是错的),结果用二分图匹配做了出来

蒟蒻感觉思路不太好想,难度大概在蓝题~紫题,至于为什么是黑题。。

那是因为UVa输出换行空格万年老坑

#include<cstdio>
#include<cstring>
using namespace std;
#define N 27
int vis[N],match[N],ans[N],x1[N],x2[N],y1[N],y2[N],n,T;
bool g[N][N],flag;

inline bool dfs(int x) {
    for (register int i=1; i<=n; i++)
        if (!vis[i] && g[x][i]) {
            vis[i]=1;
            if (!ans[i] || dfs(ans[i])) {
                ans[i]=x;//第 i 个幻灯片对应数字为 x
                return true;
            }
        }
    return false;
}

inline int find() {//求二分图最大匹配
    int sum=0;
    memset(ans,0,sizeof ans);
    for (register int x=1; x<=n; x++){
            memset(vis,0,sizeof vis);
            if (dfs(x)) sum++;// 总匹配数
    }
    return sum;
}

int main() {
    while(~scanf("%d",&n) && n) {
        printf("Heap %d\n",++T);
        memset(g,0,sizeof g);

        for (int i=1; i<=n; i++)
            scanf("%d%d%d%d",&x1[i],&x2[i],&y1[i],&y2[i]);
           
        for (int i=1,x,y; i<=n; i++) {
            scanf("%d%d",&x,&y);
            for (int j=1; j<=n; j++)
                if (x>=x1[j] && x<=x2[j] && y>=y1[j] && y<=y2[j])
                    g[i][j]=1;//如果数字在幻灯片范围之内的话则连边,有机会匹配
        }

        int tot=find(),flag=0;

自此已求出当前的匹配,但程序还未结束,如果在此输出答案:

    for (int i=1;i<=n;i++) printf("(%c,%d)",i-1+'A',ans[i]);

按照样例数据,你会发现第一组数据已有正确答案,而第二组数据不是none,而输出了匹配情况

这是因为题目还有一个要求:
若出现多种对应的情况,我们称这种对应是无法实现的。

第二组数据中A和B都可以匹配1和2中任意一个,所以对应不唯一

        //接下来我们要去除这种情况
        
        for (int j=1; j<=n; j++)
            for (int i=1;i<=n; i++)
                if (g[i][j]) {
                    g[i][j]=0;//考虑依次删去每条边,如果有唯一对应,那么至少有一边删去后使匹配数减少
                    if (find()!=tot) {
                        if (flag) printf(" ");
                        else flag=1;
                        printf("(%c,%d)",j-1+'A',i);//如果幻灯片 j 与 数字 i 是唯一搭配,直接输出
                    }
                    g[i][j]=1;
                }
        if (!flag) printf("none");//如果删去任意一边匹配数都不变,则对应不唯一
        puts("\n");//相当于printf("\n\n");
    }
    return 0;
}

萌新的第一篇黑题题解,第一次给没有题解的题写题解,第二道黑题QWQ

发表于 2019-07-22 15:40 Randolph、 阅读() 评论() 编辑 收藏

 

版权声明:本文为Randolph68706原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/Randolph68706/p/11226249.html

UVA663 Sorting Slides(烦人的幻灯片)的更多相关文章

  1. 题解-P3810

    P3810 【模板】三维偏序(陌上花开) 更好的阅读体验1 更好的阅读体验2 前置算法 树状数组求逆序对 归并 […]...

  2. Candy (candy)

    Description Due to its great contribution to the mainte […]...

  3. TYVJ(腾讯大战360) 题解

    题目链接http://www.tyvj.cn/  (P1356) 现在,腾讯与360由于身处异地,非常迫切地想 […]...

  4. 浅谈可持久化Trie与线段树的原理以及实现(带图)

    当我们需要保存一个数据结构不同时间的每个版本,最朴素的方法就是每个时间都创建一个独立的数据结构,单独储存。 但 […]...

  5. P5663 加工零件 题解

    P5663 加工零件 题解 原题链接 简要题意: 给定一个图,每次询问从 \(x\) 节点开始,\(y\) 步 […]...

  6. 题解 P6688 可重集

    己所欲者,杀而夺之,亦同天赐 解题思路 一定不要用自动溢出的 Hash!!!!!!! 我真的是调吐了。。。 思 […]...

  7. 2019牛客多校第三场

    B Crazy Binary String 题意 给一个01字符串,求0和1个数相同的最长子序列和子串长度。 […]...

  8. CodeChef-RNDRATIO Mysterious Ratio 题解

    CodeChef-RNDRATIO Mysterious Ratio 题意简述: 对每个 \(1 \le i […]...

随机推荐

  1. 堆排序(实现c++)

      堆可以看作是一个完全二叉树,分为大顶堆和小顶堆,本文我们以大顶堆为例来实现堆排序。   (1)建堆   先 […]...

  2. 黑客6种方法入侵你的计算机系统

      考虑计算机黑客如何入侵计算机系统,其实就是讨论计算机网络是怎样连接的。中国黑客教父,元老,知名网络安全专家 […]...

  3. python+unittest框架第二天unittest之简单认识Test Suite:测试套件

      今天了解下测试套件Test Suite,什么是测试套件,测试套件是由多个Test Case测试用例组成的, […]...

  4. LeetCode 题目图解汇总(LeetCode Animation All in One)

    GitHub Repo:LeetCodeAnimation Follow: MisterBooo · GitH […]...

  5. H3C系列之三层交换机系统版本升级

    本文涉及到的硬件与软件交换机:H3C S3600-28TP-SItftp软件:tftpd32小软件升级的文件: […]...

  6. DOS命令(系统错误5,拒绝访问)的解决方法

    DOS命令(系统错误5,拒绝访问)的解决方法   在用DOS命令启动MySQL服务时,出现(系统错误5,拒绝访 […]...

  7. AdaBoost 算法-分析波士顿房价数据集

    在机器学习算法中,有一种算法叫做集成算法。AdaBoost 算法是集成算法的一种,由Freund 等人于199 […]...

  8. 什么是POP3、SMTP和IMAP?

    什么是POP3、SMTP和IMAP? POP3 POP3是Post Office Protocol 3的简称, […]...

展开目录

目录导航