Poj_1486 Sorting Slides -必须边

题目:找出唯一的矩阵对应点的方案。

方法:1、想进行一次最大匹配,然后每次删除一条匹配边在进行一次最大匹配,看边是否必须。

吐槽:完全没想到可以这么暴力,还有题目从‘A‘开始标号,表明题目数据范围是[1,26]。

/************************************************
Author        :DarkTong
Created Time  :2016/8/1 8:33:20
File Name     :Poj_1486.cpp
*************************************************/

//#include <bits/stdc++.h>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
const int maxn = 30 + 10;
int w[maxn][maxn], n, m;
int Left[maxn];
bool used[maxn];
bool match(int i)
{
    for(int j=1;j<=m;++j) if(w[i][j]&&!used[j])
    {
        used[j] = true;
        if(!Left[j]||match(Left[j]))
        {
            Left[j] = i;
            return true;
        }
    }
    return false;
}
//返回最大匹配数
int hungary()
{
    int res=0;
    memset(Left, 0, sizeof(Left));
    for(int i=1;i<=n;++i)
    {
        memset(used, 0, sizeof(used));
        if(match(i)) res++;
    }
    return res;
}
int rec[maxn][4], poi[maxn][2], edge[maxn][2], vis[maxn];

int main()
{
    int T, cas=1;
    while(scanf("%d", &n)==1&&n)
    {
        memset(w, 0, sizeof(w));
        memset(vis, 0, sizeof(vis));
        m=n;

        for(int i=1;i<=n;++i) scanf("%d%d%d%d", &rec[i][0], &rec[i][1], &rec[i][2], &rec[i][3]);
        for(int i=1;i<=n;++i) scanf("%d%d", &poi[i][0], &poi[i][1]);
        for(int i=1;i<=n;++i)
            for(int j=1;j<=n;++j)
            {
                if(poi[j][0]>=rec[i][0]&&poi[j][0]<=rec[i][1]&&rec[i][2]<=poi[j][1]&&poi[j][1]<=rec[i][3])
                    w[j][i]=1;//, printf("--%d %d\n",j,i);
            }
        int e, ans=0;
        if(hungary()==n)
        {
            ans=n;
            for(int i=1;i<=n;++i)
                edge[i][0]=Left[i], edge[i][1]=i;
            for(int i=1;i<=n;++i)
            {
                w[edge[i][0]][edge[i][1]]=0;
                if(hungary()==n)
                {
            //        printf("%d %d\n", edge[i][0], edge[i][1]);
                    vis[i]=1;
                    ans--;
                }
                w[edge[i][0]][edge[i][1]]=1;
            }
        }
        printf("Heap %d\n", cas++);
        if(ans==0) puts("none\n");
        else
        {
            for(int i=1;i<=n;++i) if(!vis[i])
            {
                printf("(%c,%d) ", ‘A‘+edge[i][1]-1, edge[i][0]);
            }
            puts("\n");
        }

    }

    return 0;
}
时间: 2024-12-13 09:22:21

Poj_1486 Sorting Slides -必须边的相关文章

二分图行列匹配与最大匹配必须边

hdu1287 题意:在棋盘上放置车,要求车不能相互攻击,即要求车要在不同的行和列,二分图行列匹配 但是又问,那些点如果不放置车,就不能形成最大匹配,即哪些边是最大匹配的必须边 判断是否是最大匹配的必须边,只要删除该边之后做匹配,将匹配的个数与原先的个数比较就知道该边是不是最大匹配的必须边 1 #include <stdio.h> 2 #include <string.h> 3 const int N = 100 + 10; 4 int Map[N][N]; 5 int n,m,k

POJ 1486 Sorting Slides

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

最大匹配必须边

poj1486 题意: 给出一些矩形的坐标和一些点的坐标,若点在矩形内,则该点和该矩形匹配. 问哪些匹配边是可以唯一确定的,可以先求出最大匹配,然后每次删除一条匹配边, 然后再求最大匹配,如果匹配个数不变,那么该边不是必须边,否则就是必须边 1 #include <stdio.h> 2 #include <string.h> 3 const int N = 1000; 4 struct node 5 { 6 int xMin,xMax,yMin,yMax; 7 }slide[N];

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 1486 Sorting Slides【二分图匹配】

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

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

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

Sorting Slides(二分图匹配——确定唯一匹配边)

题目描述: 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 minimalist,

二分图最大匹配的可行边和必须边

由于是在OneNote上事先写好的,所以直接复制过来,但是发现怎么效果这么差...TAT...貌似把图片拖到新的网页里看效果还是可以的... By NeighThorn

poj 1486(二分图必须边)

题意:有n张幻灯片重叠在一起,给出了每张矩形幻灯片在坐标系上的范围大小,然后给出了n个页码在坐标系的位置,因为幻灯片都是透明的所以无法确定页码是在哪个幻灯片上,需要判断有哪些幻灯片的页码可以确定,幻灯片给出的顺序是A-,页码给出的顺序是1-. 题解:先建图,幻灯片是一个集合,页码是另一个集合,页码a在幻灯片b内部可以连一条边,然后先进行二分图匹配找到最大匹配数,然后枚举每一条边,如果删除这条边再进行以此二分图匹配,这时得到的最大匹配数如果和之前的不相等(页码可以有其他的幻灯片匹配),说明这条边是