POJ-1486-Sorting Slides
http://poj.org/problem?id=1486
给出一些矩形的坐标和一些点的坐标,若点在矩形内,则该点和该矩形匹配,问是否存在某个匹配在所有的完美匹配中,这题可以先任意找出一个完美匹配,然后依次删除该匹配的每一条边,若仍能构成完美匹配,则这个匹配不唯一,若不能构成完美匹配,则该匹配唯一
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
#define MAX 1000
int map[MAX][MAX],path[MAX];
int visit[MAX],result[MAX];
struct cam
{
int x1,x2,y1,y2;
}list[MAX];
int n;
int find(int a)
{
int i;
for(i=0;i<n;i++)
if(!visit[i]&&map[a][i])
{
visit[i]=1;
if(result[i]==-1||find(result[i]))
{
result[i]=a;
return 1;
}
}
return 0;
}
int solve()
{
int i,ans;
ans=0;
memset(result,-1,sizeof(result));
for(i=0;i<n;i++)
{
memset(visit,0,sizeof(visit));
if(find(i))
ans++;
}
return ans;
}
int main()
{
int x1,x2,y1,y2,i,j,flag;
int x,y;
int cas=1,ans;
while(scanf("%d",&n),n)
{
for(i=0;i<n;i++)
scanf("%d%d%d%d",&list[i].x1,&list[i].x2,&list[i].y1,&list[i].y2);
memset(map,0,sizeof(map));
for(i=0;i<n;i++)
{
scanf("%d%d",&x,&y);
for(j=0;j<n;j++)
{
if(x>list[j].x1&&x<list[j].x2&&y>list[j].y1&&y<list[j].y2)
map[i][j]=1;
}
}
ans=solve();
flag=0;
printf("Heap %d\n", cas++);
if(ans==n)
{
for(i=0;i<n;i++)
path[i]=result[i];
for(i=0;i<n;i++)
{
map[path[i]][i]=0; //删边
if(solve()==n) //再做一次二分匹配
continue;
else
{
if(flag)
printf(" ");
printf("(%c,%d)",'A'+i,path[i]+1);
flag=1;
}
map[path[i]][i]=1;
}
}
if(!flag)
printf("none");
printf("\n\n");
}
return 0;
}