POJ1486 Sorting Slides (二分图求最大匹配)

来源:互联网 发布:东盟共同体 知乎 编辑:程序博客网 时间:2024/06/05 16:14

题目链接:http://poj.org/problem?id=1486


题意:有n个矩形以及m个编号,给出矩形的右上角和左下角,以及每一个编号的坐标,如果该编号位于一个矩形内则编号对应这个矩形,求所有唯一的编号对应唯一的矩形


思路:构建二分图,编号对应矩形连边,求出最大匹配res,如果res=n则有可能成立,依次讲边删除,再求最大匹配,得出结果和res不一样,则这条边的编号和矩形是唯一对应的


#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#define maxn 1030using namespace std;int n,G[maxn][maxn],list[maxn],vis[maxn],link[maxn];int x1[maxn],y1[maxn],x2[maxn],y2[maxn];int find (int u){    for (int i=1;i<=n;i++)    {        if (G[u][i] && vis[i]==0)        {            vis[i]=1;            if (list[i]==-1 || find(list[i]))            {                list[i]=u;                return 1;            }        }    }    return 0;}int hungry(){    memset(list,-1,sizeof(list));    int sum=0;    for (int i=1;i<=n;i++)    {        memset(vis,0,sizeof(vis));        if (find(i)) sum++;    }    return sum;}int main(){    int cas=1;    while (scanf("%d",&n)!=EOF)    {        if (n==0) break;        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;i<=n;i++)        {            int x,y;            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;            }        }        printf("Heap %d\n",cas++);        int flag=0,res=hungry();        for (int i=1;i<=n;i++)         link[i]=list[i];        if (res==n)        {            for (int i=1;i<=n;i++)            {                int u=link[i];                G[u][i]=0;                if (hungry()!=res)                {                    if (flag) printf(" ");                    printf("(%c,%d)",'A'+i-1,u);                    flag=1;                }                G[u][i]=1;            }        }        if (!flag)        {            printf("none");        }        printf("\n\n");    }}


0 0