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. P2184 贪婪大陆 题解

    P2184 贪婪大陆 题解 P2184 贪婪大陆 题目描述 小FF最后一道防线是一条长度为N的战壕, 小FF拥 […]...

  2. CF1330B题解

    题意: 给定一个长为 \(n\) 序列 \(a\) ,问是否能分成两个排列,并输出方案 (排列:从 \(1—n […]...

  3. 题解 UVA1608 【不无聊的序列 Non-boring sequences】

    思路: 算法很显然: 一、在区间\([l,r]\)找到一个只出现一次的元素P(如果不存在,那么序列\(bori […]...

  4. 1321 棋盘问题 题解

           题解:dfs搜索 代码: #include <iostream>#include & […]...

  5. CodeChef-RNDRATIO Mysterious Ratio 题解

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

  6. 【CF1425H】Huge Boxes of Animal Toys 题解

    水 分类讨论 极端思维 原题链接 题意简介: 已知分别处在 \((-\infty,-1]\) H、\((-1, […]...

  7. [NOI1997] 积木游戏(dp)

    ·题目描述 一种积木游戏,游戏者有N块编号依次为1,2,…,N的长方体积木。第I块积木通过同一顶点三条边的长度 […]...

  8. 『最大M子段和 线性DP』

    最大M子段和(51nod 1052) Description N个整数组成的序列a[1],a[2],a[3], […]...

随机推荐

  1. 【转】Java中重载和重写的区别

      1,             重载(Overloading)  (1)       方法重载是让类以统一的 […]...

  2. 直播平台千千万,一对一/一对多直播源码快速搭建的终极秘密

    直播平台千千万,一对一/一对多直播源码快速搭建的终极秘密 初创公司如果打算自建视频直播平台,其实技术研发成本比 […]...

  3. HBase基础知识(6):扫描操作介绍 – 爱你一万年123

    HBase基础知识(6):扫描操作介绍 扫描操作的使用跟get()方法非常相似。同样,和其他函数类似,这里也提 […]...

  4. python

    1.计算机基础知识2.python基础3.垃圾回收机制、流程控制4.数据类型内置方法5.文件操作6.函数7.模块ATM+购物车项目8.面向对象9.网络编程10.并发编程11.MySQL数据库12.前端开发13.d...

  5. Mac下搭建Apache+PHP+MySql运行环境

    前言   我们在Mac上搭建Apache+PHP+MySql环境是非常方便的,因为Mac预装的有Apache和 […]...

  6. SonarQube搭建手记

    前提 这篇文章记录的是SonarQube服务搭建的详细过程,应用于云迁移后的PipleLine的代码扫描环节。 […]...

  7. 快速傅里叶变换(FFT)

    快速傅里叶变换(FFT) 2017年12月09日 20:09:51 爱玲姐姐 阅读数 2747更多 分类专栏: […]...

  8. LeetCode 面试题56 – I. 数组中数字出现的次数 | Python

    面试题56 – I. 数组中数字出现的次数 题目 一个整型数组 nums 里除两个数字之外,其他数 […]...

展开目录

目录导航