判断一些点属于哪些矩阵,每个矩阵是透明的,要求输出所有能够确定的顺序。
二分图并判断每一个点是否是唯一匹配,先做一次最大匹配,在对一个点删除其匹配边,重新对该点进DFS,若能找到新的匹配,则该点不是唯一匹配
反之,是唯一匹配,输出。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN = 1005;
bool map[MAXN][MAXN];
bool visy[MAXN];
int match[MAXN];
int n1,n2;//x集合的个数,y集合的个数
bool DFS(int x)
{
for(int i = 1;i<=n2;i++)
{
if(!visy[i]&&map[x][i])
{
visy[i] = true;
if(match[i]==-1||DFS(match[i]))
{
match[i] = x;
return true;
}
}
}
return false;
}
struct Rect
{
int xmin;
int xmax;
int ymin;
int ymax;
};
struct Point
{
int x;
int y;
};
Rect rect[1005];
Point point[1005];
int main()
{
int n,cnt = 0;
while(scanf("%d",&n)&&n)
{
n1 = n2 = n;
memset(map,0,sizeof(map));
memset(match,-1,sizeof(match));
for(int i = 1;i<=n;i++)
{
scanf("%d %d %d %d",&rect[i].xmin,&rect[i].xmax,&rect[i].ymin,&rect[i].ymax);
}
for(int i = 1;i<=n;i++)
{
scanf("%d %d",&point[i].x,&point[i].y);
}
for(int i = 1;i<=n;i++)
{
for(int j = 1;j<=n;j++)
{
if(point[i].x>=rect[j].xmin&&point[i].x<=rect[j].xmax&&point[i].y
>=rect[j].ymin&&point[i].y<=rect[j].ymax)
{
map[i][j] = 1;
}
}
}
for(int i = 1;i<=n;i++)
{
memset(visy,false,sizeof(visy));
DFS(i);
}
cnt++;
printf("Heap %d\n",cnt);
int flag = 0;
for(int i = 1;i<=n;i++)
{
if(match[i]!=-1)
{
int tmp = match[i];
match[i] = -1;
map[tmp][i] = 0;
memset(visy,0,sizeof(visy));
if(!DFS(tmp))
{
if(flag)
printf(" ");
printf("(%c,%d)",'A'+i-1,tmp);
flag = 1;
match[i] = tmp;
}
map[tmp][i] = 1;
}
}
if(flag==0)
printf("none");
printf("\n\n");
}
return 0;
}