poj 1486 Sorting Slides 二分匹配

来源:互联网 发布:c语言 按位取反 编辑:程序博客网 时间:2024/06/05 18:25

                 题意:给出几张纸的覆盖范围,和几个标号的坐标,求最多的可以确定这些纸的标号

                 思路:每张纸作为X部,标号作为Y部,如果标号在纸中,则连一条边,求最大匹配。检验是否有多重的匹配时,可以枚举删除匹配边,再对其进行匹配,若找到匹配边,                  则该纸的标号不确定。

                以下是代码:

              

#include<stdio.h>#include<iostream>#include<cstring>#include<queue>#include<algorithm>#include<vector>#define maxn 30using namespace std;int g[maxn][maxn],mat[maxn],vis[maxn],n,ca=1,xmin[maxn],xmax[maxn],ymin[maxn],ymax[maxn];int x,y;bool find(int x){    for(int i=1;i<=n;i++)    {        if(!vis[i]&&g[x][i])        {            vis[i]=1;            if(mat[i]==0||find(mat[i]))            {                mat[i]=x;                return 1;            }        }    }    return 0;}int Hungary(int n){    int Max=0;    memset(mat,0,sizeof(mat));    for(int i=1;i<=n;i++)    {        for(int j=1;j<=n;j++) vis[j]=0;        if(find(i)) Max++;    }    return Max;}int main(){    while(~scanf("%d",&n),n)    {        memset(g,0,sizeof(g));        for(int i=1;i<=n;i++)          scanf("%d %d %d %d",&xmin[i],&xmax[i],&ymin[i],&ymax[i]);        for(int i=1;i<=n;i++)          {              scanf("%d %d",&x,&y);              for(int j=1;j<=n;j++)                if(x>=xmin[j]&&x<=xmax[j]&&y>=ymin[j]&&y<=ymax[j])                   {                       g[i][j]=1;                   }          }        printf("Heap %d\n",ca++);        int k=Hungary(n);        if(k<n) { printf("none\n\n");continue; }        int flag=0;        for(int i=1;i<=n;i++)            {                memset(vis,0,sizeof(vis));                int tmp=mat[i];                mat[i]=0;                g[tmp][i]=0;                if(!find(tmp))                {                    flag=1;                    mat[i]=tmp;                    printf("(%c,%d)",'A'+i-1,tmp);                    if(i!=n) printf(" ");                }                g[tmp][i]=1;            }        if(!flag) printf("none");        printf("\n\n");    }    return 0;}

原创粉丝点击