poj 1486
来源:互联网 发布:电视网络机顶盒 编辑:程序博客网 时间:2024/06/06 15:38
题目意思就是要绝对匹配。先找点和矩形的匹配,点在矩形中就算二者匹配。然后找出最大匹配。枚举每条匹配边,删除后再次进行匹配,但不能匹配时(即新的最大匹配比原匹配小),该边即为所求的绝对匹配边,将其输出。若不存在这样的边,输出“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;
}
- poj 1486
- poj 1486
- POJ 1486
- POJ-1486-Sorting Slides
- poj 1486 Sorting Slides
- POJ 1486 Sorting Slides
- POJ-1486-Sorting Slides
- poj 1486 Sorting Slides
- POJ
- poj
- POJ
- POJ
- poj
- poj
- POJ
- POJ
- poj
- POJ
- Single-item Containers,Frame
- DevOps,不是一个传说!
- 归并排序
- How to configure XDB for using ftp and http protocols with ASM [ID 357714.1]
- 两个简单的循环
- poj 1486
- Ubuntu 163源的问题
- ubuntu10.04下配置nutch-1.2
- 本科2007级德育答辩工作
- 多维数据集(转载的)
- 浏览器禁用JavaScript后的恶果
- CTS 测试 CtsLocationTestCases:出现了Service not Available不通过。
- 直流电源总结
- C语言头文件的使用