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. leetcode 题解

    leetcode 题解 92. 反转链表 II 方法一: 提交代码: /** * Definition for […]...

  2. 【CF1443E】Long Permutation 题解(排列生成模板)

    排列生成 (树状数组 二分查找) 组合数学 基于数据范围的暴力 原题链接 题意简介 给定一个长度为 n 的排列 […]...

  3. Lintcode395 Coins in a Line II solution 题解

    Lintcode395 Coins in a Line II solution 题解 【题目描述】 There […]...

  4. UVA 10699 Count the factors 题解

    UVA 10699 Count the factors 题解 Time limit 3000 ms OS Li […]...

  5. I – Two Operations Gym – 102263M 优先队列水题

    Two Operations Gym – 102263M Ayoub has a string S […]...

  6. 「LibreOJ NOIP Round #1」序列划分

    solutions 题面loj#542 对我来说,这或许已经超出了我的能力,我,只能看题解 不知道我写完这一篇 […]...

  7. 洛谷P2763题解

    吐槽一下:蜜汁UKE是什么玩意?! 题目分析: 观察题面,对于给定的组卷要求,计算满足要求的组卷方案,可以发现 […]...

  8. 「题解」黑暗塔 wizard

    本文将同步发布于: 洛谷博客; csdn; 博客园; 简书。 题目 题意简述 给定 \(y\),求 \(\va […]...

随机推荐

  1. 编译原理词法分析:从正则表达式到生成代码 – jerry_fuyi

    编译原理词法分析:从正则表达式到生成代码 引言 最近在学编译原理,一门理论与实践结合的课程,我把作业发到博客里 […]...

  2. Vue路由

    ## 什么是路由 1. **后端路由:**对于普通的网站,所有的超链接都是URL地址,所有的URL地址都对应服 […]...

  3. 数论小白都能看懂的平面凸包详解

    0.前言: 本文将已详细的配图,带您轻松入门平面凸包。 1.引入: 假设一个操场上有一些小朋友,下面是航拍视角 […]...

  4. IAP 程序内购 – Stars-OnMyWay

    IAP 程序内购   最近用到IAP内置购买,阅读官方文档,在网上找了些资料,在这里作下整理,以便日后查找和修 […]...

  5. 微信小程序在线制作 自己制作微信小程序 – 浙江百牛信息技术

    微信小程序在线制作 自己制作微信小程序 小程序是个什么东西?怎么自己制作微信小程序?微信小程序在线制作难吗?最 […]...

  6. 前端代码高亮显示解决方案: prism

    前端代码高亮显示解决方案: prism 目录 1. 场景描述 2. React Prism 2.1 prism […]...

  7. .Net将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),并使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA

    前言:    前段时间因为项目进度比较繁重所以一直都没有时间更新博客,内心深深的负重感,没有履行年初立下的fl […]...

  8. 漫画谈-微积分学习(一)

          背景      大家有没有考虑过,工作(编程)一段时间之后,我们都会出现技术上的瓶颈,怎么去突破? […]...

展开目录

目录导航