题目意思就是要绝对匹配。先找点和矩形的匹配,点在矩形中就算二者匹配。然后找出最大匹配。枚举每条匹配边,删除后再次进行匹配,但不能匹配时(即新的最大匹配比原匹配小),该边即为所求的绝对匹配边,将其输出。若不存在这样的边,输出“none”。
以下是详细代码:
- #include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int M=30; - struct point
{
int xmin,xmax,ymin,ymax;
}p[M];
bool map[M][M];
bool vis[M];
int result[M],ans;
int n; - void init()
{
memset(result,0,sizeof(result));
memset(map,0,sizeof(map));
memset(map1,0,sizeof(map1));
ans=0;
} - bool find(int a)
{
int i,j;
for(i=1;i<=n;i++)
{
if(map[a][i] && !vis[i])
{
vis[i]=1;
if(result[i]==0 || find(result[i]))
{
result[i]=a;
return true;
}
}
}
return false;
} - void work()
{
for(int i=1;i<=n;i++)
{
memset(vis,0,sizeof(vis));
if(find(i)) ans++;
}
} - int main()
{
int t=1;
while(scanf("%d",&n),n)
{
int i,j;
init();
for(i=1;i<=n;i++)
{
scanf("%d%d%d%d",&p[i].xmin,&p[i].xmax,&p[i].ymin,&p[i].ymax);
}
for(i=1;i<=n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
for(j=1;j<=n;j++)
{
if(x>=p[j].xmin && x<=p[j].xmax && y>=p[j].ymin && y<=p[j].ymax)
map[i][j]=1;
}
}
work();
int cnt=0;
printf("Heap %d/n",t++);
if(ans<n)
{
printf("none/n");
printf("/n");
continue;
}
for(i=1;i<=n;i++)
{
int tmp=result[i];
result[i]=0;
map[tmp][i]=0;
memset(vis,0,sizeof(vis));
if(!find(tmp))
{
cnt++;
result[i]=tmp;
printf("(%c,%d) ",'A'+i-1,tmp);
}
map[tmp][i]=1;
}
if(cnt==0)
printf("none/n");
else
printf("/n");
printf("/n");
}
return 0;
}