poj 1486(二分图必须边)

题意:有n张幻灯片重叠在一起,给出了每张矩形幻灯片在坐标系上的范围大小,然后给出了n个页码在坐标系的位置,因为幻灯片都是透明的所以无法确定页码是在哪个幻灯片上,需要判断有哪些幻灯片的页码可以确定,幻灯片给出的顺序是A…,页码给出的顺序是1…。

题解:先建图,幻灯片是一个集合,页码是另一个集合,页码a在幻灯片b内部可以连一条边,然后先进行二分图匹配找到最大匹配数,然后枚举每一条边,如果删除这条边再进行以此二分图匹配,这时得到的最大匹配数如果和之前的不相等(页码可以有其他的幻灯片匹配),说明这条边是必须的(也就是解),否则这条边不确定。

#include <stdio.h>
#include <string.h>
#include <vector>
using namespace std;
const int N = 105;
struct Sli {
    int xmin, xmax, ymin, ymax;
}sli[N];
int n, vis[N], link[N], x[N], y[N], g[N][N];

bool dfs(int u) {
    for (int i = 0; i < n; i++) {
        if (!vis[i] && g[u][i]) {
            vis[i] = 1;
            if (link[i] == -1 || dfs(link[i])) {
                link[i] = u;
                return true;
            }
        }
    }
    return false;
}

int hungray() {
    memset(link, -1, sizeof(link));
    int res = 0;
    for (int i = 0; i < n; i++) {
        memset(vis, 0, sizeof(vis));
        if (dfs(i))
            res++;
    }
    return res;
}

int main() {
    int cas = 1;
    while (scanf("%d", &n) && n) {
        memset(g, 0, sizeof(g));
        printf("Heap %d\n", cas++);
        for (int i = 0; i < n; i++)
            scanf("%d%d%d%d", &sli[i].xmin, &sli[i].xmax, &sli[i].ymin, &sli[i].ymax);
        for (int i = 0; i < n; i++)
            scanf("%d%d", &x[i], &y[i]);
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++)
                if (x[j] >= sli[i].xmin && x[j] <= sli[i].xmax && y[j] >= sli[i].ymin && y[j] <= sli[i].ymax)
                    g[i][j] = 1;
        }
        int res = hungray(), flag = 0;
        for (int i = 0; i < n; i++)
            for (int j = 0; j < n; j++) {
                if (g[i][j]) {
                    g[i][j] = 0;
                    int temp = hungray();
                    if (temp < res) {
                        if (!flag)
                            flag = 1;
                        else
                            printf(" ");
                        printf("(%c,%d)", ‘A‘ + i, j + 1);
                    }
                    g[i][j] = 1;
                }
            }
        if (!flag)
            printf("none");
        printf("\n\n");
    }
    return 0;
}
时间: 2024-11-07 13:16:10

poj 1486(二分图必须边)的相关文章

POJ 1486 Sorting Slides

http://poj.org/problem?id=1486 题意:给n个矩形的4个边界的坐标(左上和右下),分别是:xmin.xmax.ymin.ymax.又给出四个数字的坐标.每个数字只能属于一个矩形.求出每个数字的从属关系. 题解:二分图最大匹配问题:数字和矩形的匹配.要求出每一条必须边.先求出最大匹配ans,然后删除每一条边,再进行匹配,看最大匹配是否等于ans:如果相等,则这条边不是必须边:如果  小于ans,则这条边是必须边. 注意点:删除边之后要恢复这条边:输出格式-- 1 #in

POJ 2446 二分图匹配

题意:给你一个n*m方格 让你用1*2的的小方格去铺满,其中有k个方格不能被铺到. 思路:二分图建图, 以每个格子为点建图,如果可以用一块1*2的小方格铺到,就连一条边. 每个格子在X集合和Y集合都有一个点,只要任意一边被匹配到了就算可以,然后就是二分图匹配了. 上代码. #include<stdio.h> #include<string.h> #include<algorithm> #include<iostream> #include<vector

POJ 2195 二分图最小权匹配KM算法

本来是打算昨天晚上写的, 昨天网速渣的连CSDN都进不去,没办法 只能现在来写了 先写写对KM算法的理解,KM算法是对每个点设置一个顶标,只有当边长等于两边点的顶标之和的时候才进行增广,这样就能保证得到的一定是最大权匹配. 如果找不到匹配的时候就对交替路中X集合的顶标减少一个d Y集合的顶标增加一个d. 这样两个点都在交替路中的时候x[i]+y[i]的和不边 X在 Y不在的时候x[i]+y[i]减少,可能就会为图增加一对匹配. X不在Y在的时候x[i]+y[i]增加, 原来不在现在依然不在其中.

poj 2226 二分图 最小点覆盖 , 最大流

题目就是问如何用最小的板覆盖所有的草地.可以横着放,也可以竖着放,允许一个草地放多个点. 建图方法就是 每个横向的草地作为X,纵向连续的草地作为Y.     X连接Y的边表示,  这里有他们的公共点.. 很显然,覆盖所有草地,就是覆盖所有的边 ,二分图中,最小点覆盖 = 最大匹配 = =其实如果存在一条边未被选中的节点覆盖,则必然存在一条对应的增广路径 //tpl //ipqhjjybj_tpl.h //header.h #include <cstdio> #include <cstdl

POJ 1486 Sorting Slides【二分图匹配】

题目大意:有n张幻灯片和n个数字,幻灯片放置有重叠,每个数字隶属于一个幻灯片,现在问你能够确定多少数字一定属于某个幻灯片 思路:上次刷过二分图的必须点后这题思路就显然了 做一次二分匹配后将当前匹配的边删除,再做一次二分匹配,如果能匹配到那么说明这条边不是必须边 顺便说下 删边以后不用从头开始二分匹配,而是在原来二分匹配的基础上对这个点进行增广就行,另外这题格式需要注意,很容易PE #include<cstdio> #include<string.h> #include<ios

POJ - 1486 Sorting Slides 二分图 完美匹配

题目大意:有n张透明的矩形纸张散乱在桌面上,每张纸张上面都有一个数字. 现在给出每个矩形的左下角和右上角坐标和每个数字所在的位置,问能否找出每个矩形唯一的对应数字 解题思路:分析该题可得到,二分图匹配的结果肯定是完美匹配,匹配的结果肯定为n. 接着就要判断每个点是否唯一匹配了 判断能否唯一匹配,就要在完美匹配的情况下,删除该点的那条匹配,如果还能再找出一个完美匹配,那么就表示该点表示不唯一 #include<cstdio> #include<vector> #include<

poj 1486 Sorting Slides(二分图匹配的查找应用)

Description Professor Clumsey is going to give an important talk this afternoon. Unfortunately, he is not a very tidy person and has put all his transparencies on one big heap. Before giving the talk, he has to sort the slides. Being a kind of minima

POJ 1325 二分图匹配/匈牙利算法

Machine Schedule Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 11922 Accepted: 5077 Description As we all know, machine scheduling is a very classical problem in computer science and has been studied for a very long history. Scheduling p

poj 3692 二分图最大匹配

题意: 已知班级有g个女孩和b个男孩,所有女生之间都相互认识,所有男生之间也相互认识,给出m对关系表示哪个女孩与哪个男孩认识.现在要选择一些学生来组成一个团,使得里面所有人都互相认识,求此团最大人数. 限制: 1 <= g,b <= 200; 0 <= m <= b*g 思路: 求最大团. 最大独立集=|V|-最大匹配 最大团=补图的最大独立集 由题意可得,互相不认识的连边,构成一个二分图,ans=|V|-最大匹配,匈牙利算法. /*poj 3692 题意: 已知班级有g个女孩和b