题目链接:http://poj.org/problem?id=1486
题意:有n个矩形以及m个编号,给出矩形的右上角和左下角,以及每一个编号的坐标,如果该编号位于一个矩形内则编号对应这个矩形,求所有唯一的编号对应唯一的矩形
思路:构建二分图,编号对应矩形连边,求出最大匹配res,如果res=n则有可能成立,依次讲边删除,再求最大匹配,得出结果和res不一样,则这条边的编号和矩形是唯一对应的
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #define maxn 1030 using 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"); } }